什么是模块?→ 模块是一种高级封装;
容器 → 元组 字典 字符串 列表:数据的封装
函数 → 语句的封装
类 → 方法(函数) 和 属性(数据)的封装
↓
模块,就是程序,比如.py文件就是一个独立的文件
一. 导入模块:
1.1 导入同一文件夹下的模块:
假如我们要导入一个hello的自定义模块:
两种写法:
a. from hello import *( 整个命名空间导入进来,覆盖整个文件,可能会造成函数,变量的冲突与替换 强烈不建议)
from hello import *
hi() #可以直接使用函数的名字,不需要加上命名空间,因为命名空间已经覆盖了主程序
b. import hello [as xxx] (中括号里可省略)( 建议使用!)
如果想在我们的主程序里使用则:
import hello # 导入模块
hello.hi() # 加上命名空间
那么如果我们想导入其他文件夹的模块怎么办呢?搜索路径会有改变吗?
↓
1.2 导入自定义文件夹里的模块 → “包”的概念的引入:
包(package):把模块分门别类的放置好
导入步骤:
1. 新建一个文件夹(或者已有的文件夹)作为包,放入你需要的脚本文件
2. 文件夹里创建一个init.py文件,可以为空,但必须有
3. 在搜索路径里加入你想要的文件夹(包)
4. 导入格式:包名.模块名
↓
我们先创建一个MyJiaoBen的包,并且创建一个空的_ _ init _ _.py文件
↓
↓
查看python当前默认的搜索路径:
import sys
print(sys.path) #默认搜索路径
这里是python默认的搜索包和模块的文件夹,所以可以在搜索路径里加入你想要的文件夹
比如我在这里想引入一个MyJiaoBen的文件夹(包)
sys.path.append("D:\\pyTest\\MyJiaoBen")
print(sys.path)
↓
导入包里面的模块:
比如我要导入MyJiaoBen包里的TempratureConversion模块:
导入格式:包名.模块名
import MyJiaoBen.TempratureConversion as mtc
TempratureConversion.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))
主程序测试:
print('32摄氏度等于', mtc.c2f(32), '华氏度')
print('99华氏度等于', "{0:.2f}".format(mtc.f2c(99)), '摄氏度')
↓
那么我们如果想事先测试一下我们的模块脚本功能是否正确,该怎么做呢?为了不影响主程序的调用。你当然可以在测试的时候在模块里调用完以后,删除或者注释掉调用的代码段。
但是你也可以使用推荐的方法:
1.3 if _ _ name _ == ’ _ main _ _’:
为了测验这个判断式,我们在主程序里做一下试验:
print(__name__) #主程序是main
print(mtc.__name__) #模块是模块名
可以看到,模块脚本在被调用的主程序里的_ _ name _ _ 属性仅仅是模块的名字,而不是_ _ main _ _,于是这个判断式则有了解释:
↓
于是我们可以把脚本修改成这样:
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并不知道是作为主程序运行,还是仅仅是作为模块测试
#如果是作为模块测试,这么写的话,当主程序掉用模块的时候,这个函数也会运行
#可以这么写:
if __name__ == '__main__':
test()
这样的话,test()仅仅会在脚本测试里被调用,在其他程序导入这个模块使用时不会被调用!
二. 独立探索模块:python标准库的探索
比如我们要探索一个timeit的模块:
import timeit
print(timeit.__doc__)
print(dir(timeit))
print(timeit.__all__) #__all__筛选出dir里的主要功能
print(timeit.__file__) #找到源文件的源代码
print(help(timeit)) #比doc详细一点
可以使用如上几个函数查看模块的介绍,各种功能的使用。