【循序渐进学Python】Python——模块(Module)和包(Package)
今天我们来学习Python中的模块(Module)和包(Package),说起这两个东西,相信大家并不陌生.在程序中应该都用过,今天我就带大家看看这两个东西究竟是什么?
模块(Module)
- Python中的模块(Module),是一个Python文件,后缀名为.py,包含了Python对象定义和Python语句.
- 模块中也能定义函数、类、变量,模块里也能包含可执行代码
导入模块的方式
-
import 模块名[,模块名,模块名,…]
-
from 模块名 import 功能名称[,功能名称,功能名称,…]
-
from 模块名 import *(导入所有功能)
-
import 模块名 as 别名
-
from 模块名 import 功能名称 as 别名
制作模块
- 在Python中,每个Python文件都可以作为一个模块,模块的名字就是文件的名字,也就是说自定义模块名称必须要符合标识符命名规则
模块测试
- 在实际开发中,当一个开发人员写完一个模块后,为了模块能够在项目中达到想要的效果,这个开发人员必须在创建这个模块中的功能时,需要对模块中的每个功能进行测试
测试方案:
-
重新创建一个测试python文件,然后倒入模块调用功能测试
-
直接也可以在模块文件中直接进行测试,但是如果稍不注意会导致测试的代码在应用场景中被调用
-
其实测试的目标指的是如果直接在模块中测试,相当于只有在模块中执行的时候才执行模块中的测试代码
name:是查看当前的运行的函数名称
mian:指的是主函数名称
导入模块,Python解析器对模块的位置的搜索顺序:
- 当前目录
- 如果不在当前目录,Python则搜索在shell变量PythonPath下的每个目录
- 如果都找不到,Python会查看默认路径。UNIX下,默认路径/user/local/lib/Python
- windows下:默认路径当前python.exe里面的lib
- 模块搜索路径存储在system模块的sys.path变量中。变量包含当前目录,PythonPath由安装过程决定
注意
- 自己的文件名不要和已有模块的文件名重复,否则会导致模块功能无法使用
- 使用from 模块名 import功能的时候,如果功能名字重复,调用到的是最后定义的或导入的功能
- 导入了模块之后的程序代码中的变量一般不能和模块的名称一致,否自在调用模块的时候,这个名称已经是变量了,不在是模块,因为Python中的变量是引用
all的使用
-
如果一个模块文件中有all变量,当使用from xxx import *导入时,只能导入这个列表中的元素,指的是将通配符进行添加筛选
-
通过all进行对进行筛选,只有被筛选中的all里面的功能才是能够代替的
Python专门提供的模块实例:
import random
print(f"随机一个整数:{random.random()}")
from random import randint as rint, random as rd
print(f"随机一个整数:{rint(1,10)}")
print(f"随机一个浮点数:{rd()}")
from random import *
print(f"随机一个整数:{randint(1,10)}")
print(f"随机一个浮点数:{random()}")
案例:
需求:需要随机出一个长度为10的列表(1-50)并对列表中的每一项进行累计减运算
import random as rand, functools as fun
my_list = []
for _ in range(10):
my_list.append(rand.randint(1, 51))
print(my_list)
res = fun.reduce(lambda a, b: a - b, my_list)
print(res)
包(Package)
- 包本质是就是文件夹 只不过多了一个init.py文件
- 包将有联系的模块组织在一起,放在同一个文件夹下面,并且在这个文件夹里面创建一个名字为init.py文件,那么这个文件夹就称之为包
制作包
- 项目中右键【new】-【Python Package】-包名-【OK】
注意:
- 包是否创建正确,检查在包创建好之后是否自动创建一个init.py文件,
init文件的作用:
- 控制着包的导入行为
导入包
- import 包名.模块名
- 包名.模块名.功能名
注意:
- 从测试角度而言如果对于包中的模块要求不高,这个包中的所有模块都可能被使用,那么不管是创建一个文件夹还是创建Python包基本上没有什么区别。
只不过包里面自动创建了一个init的python文件。那么这个init文件到底有什么作用呢?让我们接着往下看!
包还有其他导入方式?(和模块的导入一样)
- from 包名 import 模块名,模块名,…
- from 包名 import *
- import 包名.模块名 as 命名