模块和包
● 模块定义:用来从逻辑上组织python代码(变量,函数,类,逻辑:实现一个功能),本质就是.py结尾的python文件(文件名test.py,对应的模块名:test)
● 包定义:用来从逻辑上组件模块的,本质就是一个目录(必须带有一个__init__.py文件)
模块和包导入本质
● 导入模块的本质就是把python文件解释一遍
● 导入包的本质就是执行该包下的__init__.py文件;如果要导入包下面的模块:需要先导入包,然后包下的__init__.py文件中再导入该包下的模块
-
模块的四种形式
- 自定义模块,common.py就叫做common模块
- 第三方模块: 需要自己安装 13万个第三方库 ,无所不能,写库(弄得更简单)
- 内置模块: python解释器自带的,不需要安装
- 包--> 含有__init__.py的文件夹,一种特殊的模块(解决了一个问题)
import 与from...import...
import
- 以time模块为例,打开time.py文件
- 用Python解释器运行解释time.py文件,然后把得到的名字放入一个time模块的名称空间
- test.py会有一个变量名time指向time模块的名称空间/变量名t指向time模块的名称空间
#test.py import time import time as t #变量名t指向time模块的名称空间 from time import sleep from time import sleep,localtime
from...import...
- 以time模块为例,打开time.py文件
- 用Python解释器运行解释time.py文件,然后把得到的名字放入一个time模块的名称空间
- test.py会有一个变量名sleep指向time模块名称空间中的sleep名字
# *受__all__=[''] #test.py __all__ = ['f1','f2'] def f1(): print(1) def f2(): print(2) def f3(): print(3) from test import * test.f3() #无法运行 import test test.f3() # 3
循环导入
#m1.py from m2 import y x = 10 #m2.py from m1 import x y = 20
过程:m1.py --> m2.py --> m1.py ...
结果:x/y在这个过程中一直没有生成
解决方案一
#m1.py x = 10 from m2 import y #m2.py y = 20 from m1 import x
过程:m1.py --> x = 10 --> m2.py --> y = 20 --> m1.py --> x = 10
结果:x = 10 --> y = 20 --> x = 10
解决方案二
#m1.py def f1(): from m2 import y print(y) x = 10 #m2.py def f1(): from m1 import x y = 20
过程:f1() --> m2.py --> y = 20
结果:y = 20
模块的搜索路径
-
先从内存中寻找
from m2 import y print(y) import time time.sleep(10) # 10s内删除了m2 from m2 import y print(y)
-
再从内置中寻找
from time import time print(time)
-
然后从自定制寻找
x = 10
-
最后从环境变量中寻找
import sys print(sys.path) # 环境变量,模块就是在某个路径中,需要添加路径,在这里找 sys.path.append(r'D:\上海Python11期视频\python11期视频\day 16') # del sys.path[1] print(sys.path) import testt testt.f1()
Python文件的两种用途
- 作为模块文件(m1.py中调用m2.py,运行m1.py时,m2.py即为模板文件),模块可以有多个
- 作为执行文件( 当前运行的文件),执行文件只有一个
- 执行文件和模块文件是相对的
# m1.py x = 10 if __name__ == '__main__': print(x) #m2.py import m1
当运行m1.py时,即m1.py作为执行文件,此时 name==== main==,打印x
当运行m2.py时,即m1.py作为模板文件,此时name==== m1==,if条件不成立,报错
random模块
import random # 大于0且小于1之间的小数 print(random.random()) 0.42866657593385415 # 大于等于1且小于等于3之间的整数 print(random.randint(1, 3)) 3 # 大于等于1且小于3之间的整数 print(random.randrange(1, 3)) 2 # 大于1小于3的小数,如1.927109612082716 print(random.uniform(1, 3)) 2.1789596280319605 # 列表内的任意一个元素,即1或者‘23’或者[4,5] print(random.choice([1, '23', [4, 5]])) [4, 5] # random.sample([], n),列表元素任意n个元素的组合,示例n=2 print(random.sample([1, '23', [4, 5]], 2)) ['23', 1] lis = [1, 3, 5, 7, 9] # 打乱l的顺序,相当于"洗牌" random.shuffle(lis) print(lis) [9, 1, 5, 7, 3]