模块
模块就是一系列功能的集合体
模块的三种来源
1 内置模块
2 第三方模块
3 自定义模块
模块的格式
1 使用python编写的.py文件
2 已经编译为共享库或DLL的C或C++扩展
3 把一系列模块组织到一起的文件夹(注:文件夹下有一个__init__.py文件,该文件夹别称之为包)
4 使用C编写并链接到python解释器的内置模块
为什么用模块
1 使用内置的或第三方的模块的好处是:拿来主义,可以极大提升开发效率
2 使用自定义模块的好处是:可以减少代码冗余
使用模块
大前提:一定要区分开谁是执行文件,谁是被导入模块
import
文件名是xxx.py 模块名是xxx
首次导入模块
会产生一个模块的名称空间
执行文件xxx.py,将执行过程中产生的名字都放到模块的名称空间中
在当前执行文件的名称空间中拿到一个模块名,该名字指向模块的名称空间
多次导入都是直接引用第一次导入的成果,不会重新执行文件
执行文件中访问模块名称空间名字的语法:模块名.名字
指名道姓的要名字不会和当前执行文件的名字冲突
总结
优点:指名道姓的向一个名称空间要名字,肯定不会与当前名称空间中的名字冲突
缺点:但凡应用模块中的名字都需要加前缀,不够简洁
一行导入多个
可以为模块起别名
from ... import
首次导入模块
创建一个模块的名称空间
执行文件,将执行过程中产生的名字都放到模块的名称空间中
在当前执行文件中直接拿到一个名字,该名字就是执行模块中相对应的名字
总结
优点:使用时无需加前缀,更简洁
缺点:容易与当前名称空间中的名字冲突
模块路径
模块搜索路径的优先级
1 内存中已经加载过的
2 内置模块
3 sys.path # 第一个值是当前执行文件所在的文件夹
导入其他文件中的模块
sys.path(r'文件路径')
from 文件名 import 模块名
环境变量是以当前执行文件为准的
强调:所有被导入的模块参照环境变量sys.path都是以执行文件为准的
所有被导入的模块再去导入其他模块,参照的都是执行文件的sys.path
包
本质就是文件夹
函数可以使得同一给文件中代码结构更清晰
模块都是以文件形式来组织代码结构
如果文件越来越多管理起来也不方便,所以需要使用文件夹来管理
包的使用
新建一个文件夹就是一个包
包和文件夹仅有一个区别就是包中应该包含一个__init__.py文件
__init__.py文件的作用
包也是模块
在导入一个模块时发生三件事都一样
问题是第二步需要执行被导入文件的代码,包只是个文件夹不能直接执行,
所以需要提供一个py文件用来代表这个包成为一个模块
init是初始化单词的缩写,表示对包中的内容进行初始化
包的初始化其实就是导入这个包中所有其他模块
总结:导入包时本质就是在导入包下的__init__.py文件
注意:init文件的作用仅仅时导入包内模块,提供给外界使用,不应该在里面写逻辑代码
init在python2中要求必须有,在python3中式可选的
如果没有提供init文件,在使用模块时就直接使用文件夹点需要的模块名称
init的好处
可以将包内模块的功能直接导入到init文件中
这样对对于包的使用者可以无需考虑要使用的功能在哪个文件中,直接调用功能即可
使用包的流程
1 创建一个包
2 编写包内部的模块代码
3 写完后打开init文件,将需要提供给外界使用的模块导入其中(可以省略)
相对导入和绝对导入
相对导入指的时对某个模块而言的导入路径
执行文件不能使用相对导入
绝对导入指的时从执行文件开始的绝对路径,注意不是文件的酒店路径
导入时需要注意
1 import 导入时,点的后面必须时一个模块或包名
2 form 导入式 import 后面不能出现点