模块
模块就是程序,模块是高级的封装
(1)容器:数据的封装
(2)函数:语句的封装
(3)类:方法和属性的封装
模块可以实现代码的重用
命名空间
- 新建模块
- 导入模块
import hello
# 将新建的模块放入运行文件的根目录下
- 调用模块内函数
导入模块内函数时,需要带模块名。
导入模块
(1) import 模块名
# 模块名存为 TemperatureConversion.py
def c2f(cel):
fah = cel * 1.8 + 32
return fah
def f2c(fah):
cel = (fah - 32) / 1.8
return cel
# import 导入模块
import TemperatureConversion
print("32摄氏度 = %.2f华氏度" % TemperatureConversion.c2f(32))
print("99华氏度 = %.2f摄氏度" % TemperatureConversion.f2c(99))
(2) from 模块名 import 函数名
# from 模块名 import 函数名
from TemperatureConversion import c2f, f2c
print("32摄氏度 = %.2f华氏度" % c2f(32))
print("99华氏度 = %.2f摄氏度" % f2c(99))
运行结果相同
还可以使用通配符“*”来导入模块中所有命名空间
from TemperatureConversion import *
print("32摄氏度 = %.2f华氏度" % c2f(32))
print("99华氏度 = %.2f摄氏度" % f2c(99))
【注意:此方法会使命名空间的优势消失,导致名字混乱】
(3)import 模块名 as 新名字
# import 模块名 as 新名字
import TemperatureConversion as tc
print("32摄氏度 = %.2f华氏度" % tc.c2f(32))
print("99华氏度 = %.2f摄氏度" % tc.f2c(99))
if __name__ == ‘__main__’
- 在模块中添加测试代码
# 修改之前的 TemperatureConversion.py 文件
def c2f(cel):
fah = cel * 1.8 + 32
return fah
def f2c(fah):
cel = (fah - 32) / 1.8
return cel
def test():
# =============================================================================
# 每个模块中都应该有一个测试函数来保证模块的正确性
# 防止在模块组装后再出现问题
# =============================================================================
print("测试, 0摄氏度 = %.2f华氏度" % c2f(0))
print("测试, 0华氏度 = %.2f摄氏度" % f2c(0))
test()
# 这时模块就是程序
这时再导入模块运行
就会发现既输出了测试结果又输出了运行调用程序的结果
那么如何避免这种结果,关键在于让Python知道该模块作为程序运行还是导入到其他程序中,这里就用到了“__name__”变量
在运行模块调用程序(calc.py)后,即导入了TemperatureConversion模块,并重新命名为tc,观察“__name__”变量
即当文件作为模块被调用后,它的“__name__”就变成了模块的名字
所以对之前的模块代码再次进行修改
def c2f(cel):
fah = cel * 1.8 + 32
return fah
def f2c(fah):
cel = (fah - 32) / 1.8
return cel
def test():
# =============================================================================
# 每个模块中都应该有一个测试函数来保证模块的正确性
# 防止在模块组装后再出现问题
# =============================================================================
print("测试, 0摄氏度 = %.2f华氏度" % c2f(0))
print("测试, 0华氏度 = %.2f摄氏度" % f2c(0))
if __name__ == '__main__':
test()
这时再运行调用模块的程序,就不会打印测试结果了。
搜索路径
sys.path 即是python搜索模块的路径,不同电脑的路径不一定相同。
由于建立的模块并不在默认的搜索路径下,所以在import建立的模块时,会发生报错的现象,这时就要自己将存放模块的路径添加进去
包
将模块分类放置
(1)创建一个文件夹,用于存放相关的模块,文件夹的名字即包名;
(2)在文件夹中创建一个__init__.py的模块文件,内容可以为空(必须有这个文件,该文件用来告诉Python,将此文件夹看作一个包来管理);
(3)将相关的模块放入文件夹中
包名为“M1”
M1文件夹内的Python程序
修改导入模块的程序,如果没有包名“M1”则会因找不到相关模块而报错。
Python技巧
Python标准库中包含一般任务所需要的模块,所以尽可能的使用现成的模块。
(1)从Python的文档中查找标准库
(2)从社区安装第三方模块
https://pypi.python.org/pypi
(3)PEP:Python Enhancement Proposals 即Python增强建议书,用来规范与定义Python的各种加强与延伸功能的技术规格,来让Python开发社区能有共同遵循的依据。
https://www.python.org/dev/peps/
(4)善用Python的文档
(5)当想要快速上手一个模块时,可以在Python中查看该模块的文档
查看模块中定义的变量
这里的“__all__”属性显示该模块可以供外界调用的所有信息
timeit中,Timer是一个类,后面是三个接口函数。
【注意】不是所有的模块都有“__all__”这个属性,若有该属性,其中便是可供外部调用的信息;
若一个模块包含“__all__”属性,那么使用“ from timeit import * ”来导入到命名空间时,只要“__all__”属性中的名可以被导入。
“__file__”属性用来指明该模块源代码所在位置,这样就可以根据源代码所在位置,找到源代码进行阅读。
(5)使用help内置函数