一、模块介绍
1.什么是模块
其实我们前一阵已经接触过了,import xxx 、from xx import xxx
能够有一定功能的集合体就是模块,比如有某些功能的py文件,包含这个文件的文件夹
python之所以流传的这么广有很重要一个因素就是模块非常丰富,社区活跃,干活效率高
2.模块的分类
-
内置模块
>>>pycharm准备好了的
-
第三方模块
>>>行业大佬写的,我们可以拿来使用里面的功能
-
自定义模块(自创模块)
>>>自己写的python文件,.py文件就是一个模块
3.好处
- 能极大的减少代码的冗余,使结构更清晰
- 能提升写代码的效率
二、怎么用模块
只要运行文件,必然会涉及到名称空间来存放名字,可以在全局导模块,也可以在局部导模块
1.import 导入模块名字
比如说有一个叫a的py文件(a.py),那模块名就是a
模块的名称空间和执行文件的名称空间的关系图我们来画一下
!!!注意是首次哦,之后的导入不会再产生新的名称空间,没必要
因为模块点名字是指名道姓,如果执行文件A本身自己也有某名字,当在执行文件A内调用自身的变量名,不受模块的影响,就算模块那边用了破界函数关键字声明,也不会影响到执行文件A这边的名称空间
执行文件的相同变量名和模块文件的相同变量名是指向关系,模块改不会影响执行文件,是如果再调用模块中的被改过变量名,会得到模块中变量名对应的最新的数据值
如果要导入多个模块,推荐用:
import time
import func
import a
这种格式为好
2.import 导入模块拓展
如果导入模块名字不好认或者太长,可以拿一个变量名接受这个调火来的内存地址,这样以后直接变量名点也是一样的使用
例:import hihihihihihihi as t
t.xxx = hihihihihihihi.xxx
3.from import导入模块名字
import必须加前缀才能调用模块的名称,所有有一种针对模块某一名称的导入方法
from...import...
- 缺点:
容易名称混淆
三、循环导入
-
首先,不应该让两个模块相互导入,因为某模块导入一次后Python就不会再次理会导入,如果导入完毕时变量名未产生,那就不会产生名称空间,循环导入就会报错
-
如何解决:
1.把变量名赋值代码上移到导入模块代码前(提前准备好名字,产生好名称空间)
2.造一个函数,利用函数不调用不执行代码的特点——只针对一个函数用到的前提
四、判断文件类型
1.缘由
模块作者在写模块时,也想测测自己模块的功能,比如一些函数,如果在自己模块文件中直接写函数名(),自己看确实没问题,但是别人导入这个模块时,就会也跑一次函数名执行,会干扰别人的执行文件功能,所以就有一个内置函数功能,可以判断当前文件是本身还是被调用
2.用法及pycharm优化
__name__
如果是自身,打印后会反馈__main__
如果是被导入,打印后会反馈模块名字
可以把自己想测试的代码丢入到判断文件类型的条件的子代码下去
if __name__ == '__main__':
func()
....
else:
pass
pycharm优化:
顶格敲一个main,就会自动补全if __name__ == '__main__':
main = "if __name__ == '__main__':"
五、模块的查找顺序
是文件一定有存放的路径,所以就来捋捋查找的优先级
!!!一定要清楚谁是执行文件,谁是被导入文件
优先级:
1.内存
如果调一次完成了,会暂存在内存中,在再次执行调用前把模块删除了,可以再执行一次,然后会被释放,再导会报错
2.内置模块
3.文件夹找
>>>按照sys.path中存放的文件的顺序依次查找
-
sys模块
执行文件都可以调用sys,打印一下sys.path可以查看执行文件所在的系统环境
如果模块和执行文件不在一个文件夹内:
import sys
sys.path.append(r'想加的模块的文件夹的路径')
就可以使用了
就可以了>>>>
六、包
1.定义
就是一个包含有__inin__.py文件的文件夹
本质就是一个模块
python2必须要求__inin__.py文件 python3无所谓
如果导包的名字,就是在导__inin__
七、模块的导入(绝对导入、相对导入)
一个例子:
如果一个模块开发者,有一个模块,功能很多,不想后期自己维护太乱,可以把每个功能单独拎出来做一个模块,然后用一个包包住,在__init__.py文件中把包路径下的文件导入一下即可,包的名字用以前模块的名字,这样日后使用这个个包的人不会察觉到原模块已经变成包了,,只要添加一下包的那个文件夹的路径到环境变量依旧可以正常使用
绝对导入:以包的文件夹路径来导入(基于执行文件的根目录)
相对导入: .在路径中表示当前目录
..在路径中表示上一层目录
....在路径中表示上上一层目录
不在依据执行文件所在的sys.path 而是以模块自身路径为准
from . import b
相对导入只能用于模块文件中 不能在执行文件中使用
-
拓展:
-
导入模块书写的规范
1内置模块
2第三方模块
3自创模块
-
自定义模块命名推荐用纯小写+_的风格
-
from a import * *默认是将模块名称空间中所有的名字导入 被导入模块会默认有一个__all__ = []的列表,列表里面存所有的名称 __all__ = ['名字1', '名字2'] 针对*可以限制拿的名字 —————————————————————————————————————————————— 大多数情况不会用,太容易混淆