初识模块
模块
1.模块简介
-
模块的本质
内部具有一定的功能(代码)的py文件
-
python模块的历史
python刚开始的时候所有搞其他编程语言的程序员都看不起,甚至给python起了个外号>>>:调包侠(贬义)
随着时间的发展,项目的复杂度越来越高,上面那帮人也不得不用一下python,然后发现真香定律>>>:调包侠(褒义)
-
python模块的表现形式
1.py文件(py文件也可以称之为模块文件)
2.含有多个py文件的文件夹(按照模块功能的不同,划分不同的文件夹储存)
3.已被编译为共享库或DLL的c或C++扩展(了解)
4.使用C编写并链接到python解释器的内置模块(了解)
2.模块的分类
-
自定义模块
我们自己写的模块文件
-
内置模块
python解释器提供的模块
-
第三方模块
别人写的模块文件(python背后真正的大佬)
3.导入模块的两种句式
-
强调:
1.一定要搞清楚谁是执行文件,谁是被导入文件
2.以后开发项目的时候,py文件的名称一般是纯英文
不会含有中文甚至空格
3.导入模块文件不需要填写后缀名
-
import句式
以import a为例研究底层原理
1.先产生执行文件的名称空间
2.执行被导入文件的代码将产生的名字放入被导入文件的名称空间中
3.在执行文件的名称空间中产生一个模块的名字
4.在执行文件中使用该模块名点的方式使用模块名称空间中所有的名字
-
from...import...句式
以from a import name, func为例研究底层原理
1.先产生执行文件的名称空间
2.执行被导入文件的代码将产生的名字放入被导入文件的名称空间中
3.在执行文件的名称空间中产生对应的名字绑定模块名称空间中对应的名字
4.在执行文件中直接使用名字就可以访问名称空间中对应的名字
4.导入模块补充说明
-
import与from...import...两者优缺点
import句式:
由于使用模块名称空间中的名字都需要模块名的方式才可以用
所以不会轻易的被执行文件中的名字替换掉
但是每次使用模块名称空间中的名字都必须使用模块点名才可以
from...import...句式 指名道姓的导入模块名称空间中需要使用的名字 不需要模块点名
但是容易跟执行文件中名字冲突
-
重复导入模块
解释器只会导入一次,后续重复的导入语句并不会执行
-
起别名
import woailiuxiaodan as zl from woailiuxiaodan import lixiaodanaiwo as lz from a import name as n, func as f1
-
涉及到多个模块导入
import a import woailixiaodan '''如果模块功能相似度不高,推荐使用第一种,相似度可以使用第二种''' import a, woailiuxiaodan
5.循环导入问题
-
循环导入
两个文件之间彼此导入彼此,并且相互使用各自名称空间中的名字,极容易报错
-
如何解决循环导入问题
1.确保名字在使用之前就已经准备完毕
2.我们以后在编写代码的过程中应该尽可能避免出现循环导入
6.判断文件类型
所有的py文件都可以直接打印__name__对应的值
当py文件是执行文件的时候__name__对应的值是__main__
当py文件是被导入文件的时候__name__对应的值是模块名
if __name__ == '__main__':
print('我是执行文件 我可以运行这里的子代码')
上述脚本可以用来区分所在py文件内python代码的执行
使用场景:
1.模块开发阶段
2.项目启动文件
"""
from a import * *默认是将模块名称空间中所有的名字导入
__all__ = ['名字1', ‘名字2] 针对*可以限制拿的名字
"""
7.模块的查找顺序
-
内存
import aaa import time time.time(15) print(aaa.name) aaa.func1
-
内置
import time print(time) print(time.time) '''以后在自定义模块的时候尽量不要与内置模块名冲突'''
-
执行文件所在的sys.path(系统环境环境)
一定要以执行文件为准!!!
我们可以将模块所在的路径也添加到执行文件的sys.path中即可
import sys print(sys.path) # 列表 sys.path.append(r'D:\pythonProject03\day17\mymd') import ccc print(ccc.name)
8.绝对导入与相对导入
-
绝对导入
from mymd.aaa.bbb.ccc.ddd import name # 可以精确到变量名 from mymd.aaa.bbb.ccc import ddd # 也可以精确到模块名 ps:套路就是按照项目根目录一层层往下查找
-
相对导入
.在路径中表示当前目录 ..在路径中表示上一层目录 ..\..在路径中表示上上一层目录 不在依据执行文件所在的sys.path 而是以模块自身路径为准 from . import b 相对导入只能用于模块文件中 不能在执行文件中使用 ''' 相对导入使用频率较低 一般用绝对导入即可 结构更加清晰 '''