十二、模块
十二、模块
1、引子:
1、什么是模块:
模块就是一系列功能的集合体
模块有三种来源:
1.内置的模块
2.第三方的模块
3.自定义的模块
模块的格式:
1.使用python编写的.py文件
2.已被编译为共享库或DLL的c或c++扩展
3.把一系列模块组织到一起的文件夹(注:文件夹下有一个__init__.py文件,该文件夹称之为包)
4.使用c编写并连接到python解释器的内置模块
2、为何要用模块:
1.使用内置的或者第三方模块的好处是:拿来主义,可以极大提升开发效率
2.使用自定义模块的好处是:可以减少代码冗余(抽取我们自己程序中要公用的一些功能定义成模块,然后程序的各部分组件都去模块中调用共享功能)
3、如何使用模块:
大前提:一定要区分开谁是执行文件,谁是被导入模块
2、模块功能关键字import:
1、列如:
文件名是spam.py,模块名则是spam
首次导入模块会发生:
1.会产生一个模块的名称空间
2.执行文件spam.py将执行过程中产生的名字都放到模块的名称空间中
3.在当前执行文件的名称空间中拿到一个模块名,该名字指向模块的名称空间
import spam
之后的导入,都是直接引用第一导入的成果,不会重新执行文件
import spam
import spam
import spam
在执行文件时访问模块名称空间中名字的语法:模块名,名字
import spam
print(spam.x)指名道姓的跟spam要名字x,肯定不会与当前执行文件中的名字冲突
x向当前执行文件的名称空间要名字
总结:import导入模块在使用时必须加上前缀:模块名
优点:指名道姓地向某一个名称空间要名字,肯定不会与当前名称空间中的名字冲突
缺点:但凡应用模块中的名字都需要加前缀,不够简洁
可以一行导入多个模块(不推荐)
import spam,os,time
可以为模块起别名(注意:模块名应该全为小写)
import spam as sm
3、模块功能关键字from...import...:
1、首次导入模块发生3件事:
1.创建一个模块的名称空间
2.执行文件spam.py将执行过程中产生的名字都放到模块的名称空间中
3.在当前执行文件中直接拿到一名字,该名字就是执行模块中相应的名字
from spam import money
总结from...import...
优点:使用时,无需再加前缀,更简洁
缺点:容易与当前名称空间中的名字冲突
*代表从被导入模块中拿到所有名字(不推荐使用)
from spam import money,read1,read2
from spam import * #__all__=['money','read1']
起别名:
from spam import read1 as r1
4、模块的循环导入问题:
1.解决方案一:把循环导入的语句放到名字定义的后面
print('正在导入m1')
x='m1'
from m2 import y
2.解决方案二:将循环导入语句放到函数内
print('正在导入m1')
def f1():
from m2 import y,f2
print('m1.f1----y:',y)
f2()
x='m1'
5、区分python文件的两种用途:
1.当文件被执行时__name__=='__main__'
2.当文件被导入时__name__=='模块名'
if __name__=='__mian__':
f1()#此时是在执行文件本身,用于调试什么的
f2()#被当做模块执行时,if __name___=='__mian__': 下的代码不会执行
6、模块的搜索路径:
1、模块搜索路径的优先级:
1.内存中已经加载过的
2.内置模块
3.sys.path #第一值是当前执行文件所在的文件夹
import sys
print(sys.path)
import time
time.sleep(3)
4.环境变量是以当前执行文件为准的
强调:所有被导入的模块参照环境变量sys.path都是以执行文件为准的
7、绝对导入与相对导入:
1.绝对导入:以执行文件的sys.path为起点开始导入
优点:执行文件与被导入的模块中都可以使用
缺点:所有导入都是以:sys.path为起点,导入麻烦
2.相对导入:参照当前所在文件的文件夹为起始开始查找,称之为相对导入
点符号:代表当前所在文件的文件夹,一个点代表上一级文件夹,2个点代表上一级的上一级的文件夹
优点:导入更加简单
缺点:只能在导入包中的模块时才能使用,不能在执行文件中用