模块的简介、 import句式、 from...import...句式、 导入方法的补充 、如何判断文件类型 、循环导入 、模块的查找顺序
今日内容概要
- 模块的简介
- import句式
- from...import...句式
- 导入方法的补充
- 如何判断文件类型
- 循环导入
- 模块的查找顺序
今日内容详细
模块的简介
1.什么是模块
模块就是一系列功能的结合体
2.为什么要用模块
拿来主义,极大地提高了开发效率
3.模块的分类
1.内置模块:是python解释器自带的,直接拿来使用的
2.第三方模块:是别人写的,如果想用,先下载再用
3.自定义模块:自己写的
4.模块的存在形式
1.我们自己写的py文件(一个py文件就是一个模块)
2.包:一系列py文件的集合(文件夹) ps:一个包里面会有一个__init__.py文件
3.已被编译为共享库或DLL的c或C++扩展(了解)
4.使用C编写并链接到python解释器的内置模块(了解)
ps:以后再写一个复杂项目的功能时候,要先考虑有没有被人已经写好的模块,我们直接拿来使用
导入模块的两种方式
前提简要:在真正编写项目的过程中,所有的py文件名都得是英文,并且py文件被当做模块导入的时候不需要考虑后缀;导入模块有两种方式:import句式、from ...import...句式
import句式
1.语法格式:import 模块名(py文件名)
2.知识补充:
2.1 执行文件与导入文件
执行文件:指的是点击鼠标右键运行的当前文件
导入文件:是import后面的文件名就是导入文件
2.2 同一个程序反复导入相同的模块,导入语句只会执行一次
3.运行步骤
1.运行执行文件,产生了执行文件的全局名称空间
2.运行导入文件(md.py)
3.产生导入文件的全局名称空间,将导入文件中产生的名字保存到导入文件的全局名称空间
4.在执行文件,产生一个模块名(py文件名)指向导入文件的全局名称空间
import句式解析

from...import...句式
1.语法格式:from 模块名(py文件名) import 导入文件中的具体名字
2.运行步骤
1.运行执行文件,产生了执行文件的全局名称空间
2.运行导入文件(md.py)
3.产生导入文件的全局名称空间,将导入文件中产生的名字保存到导入文件的全局名称空间
4.在执行文件中获取到指定的名字,指向导入文件的名称空间
from...import...句式解析

导入文件的扩展用法
1.起别名
1.1 import 文件名 as 新的名字;
1.2 from 文件名 import 被导入文件名称空间里的名字 as 新的名字
1.3 使用别名的情况:
情况1:多个模块文件名相同(一个项目由多个人写)
情况2:原有的模块名文件复杂
2.连续导入
eg:
import time,sys,os >>>建议多个模块功能相似才一起导入,不相似尽量分开导入
推荐:
import time
import sys
import sys
from 被导入文件名 import 被导入文件名称空间里的名字1,名字2,名字3,名字4
上述导入方式是推荐使用的,因为多个名字出自于同一个模块文件中
3.通用导入
from 文件名 import * >>>不推荐使用,因为后续不能够推荐使用句点符点出来
ps:执行文件中用 from...import *导入模块,可以在导入文件中使用__all__,来限制执行文件可以用哪些名字
__all__ = ['名字1','名字2',....]限制当前文件中哪些名字可以被导入
判断文件的类型
1.判断当前文件是执行文件还是导入文件:使用__name__,因为它在不同的文件中,结果是不一样的
在执行文件中,结果是__main__ >>>类型是字符串
在导入文件中,结果是:模块名
2.
if __name__ == '__main__': >>>通过键盘输入:main加回车
pass
循环导入
1.循环导入就是两个文件彼此导入
2.循环导入的现象在实际工作中,坚决不能出现
循环导入举例

1.循环导入容易出错的原因:使用彼此的名字可能是在没有准备好的情况下就使用了
2.解决循环导入的方法:彼此在使用彼此名字之前就先准备好
ps:尽可能的避免循环导入,如果真的避免不了,就想办法让所有的名字在使用之前提前准备好
解决方法

模块的查找顺序
1.模块的查找顺序
1.先从内存中查找 >>>代码运行后产生的内存空间
2.再从内置模块中查找 >>>解释器自带的模块
3.从环境变量中查找sys.path(程序系统环境变量)
验证:先从内存中查找
导入一个文件,然后再导入过程中删除文件,发现还可以使用
执行文件代码:
import aa
import time
time.sleep(10)
print(aa.name)
导入文件代码(aa.py)
print('from aa')
name = 'nana'
操作:1.先运行执行文件
2.在10秒内,手动删除导入文件(aa.py)
结果:from aa
nana
验证:再从内置模块中查找
创建一个跟内置模块名相同的文件名
执行文件代码:
import time
print(time.name) # AttributeError: module 'time' has no attribute 'name'
print(time.index()) # AttributeError: module 'time' has no attribute 'name'
print(time.time()) # 1678180548.4664996
from time import index # ImportError: cannot import name 'index'
导入文件(time.py)代码:
print('from time')
name = 'nana'
def index():
print('111')
结果:报错
******一定要注意以后的文件名命名坚决不能跟内置模块名重名
验证:最后从环境变量中查找sys.path
执行文件默认只能在同级别中导入文件,如果想导入不同级别的文件,则需要手动在sys.path中用append()方法添加绝对路径
1.导入模块的时候,一定要知道谁是执行文件,所有的路径都是参照执行文件来的
2.pycharm会自动将项目根目录添加到sys.path中
3.sys.path 打印出来的是一个列表
import sys
print(sys.path) # ['D:\\4期学习\\pythonProject\\day18', 'D:\\4期学习\\pythonProject\\day18', 'D:\\PyCharm 2021\\plugins\\python\\helpers\\pycharm_display',...]
ps:sys.path中第一个元素的路径永远是当前文件所在的路径
4.
执行文件代码:
import c3 # ModuleNotFoundError: No module named 'c3'
导入文件代码:
print(r'from aaaa\c3')
结果:报错 ModuleNotFoundError: No module named 'c3'
解决方式:
import sys
print(sys.path) # D:\4期学习\pythonProject\day18\aaaa\c3.py,...]
sys.path.append(r'D:\4期学习\pythonProject\day18\aaaa')
print(sys.path) # ['D:\\4期学习\\pythonProject\\day18', 'D:\\4期学习\\pythonProject\\day18', ...,'D:\\4期学习\\pythonProject\\day18\\aaaa']
import c3 # from aaaa\c3
5.导入与执行文件不同层级的模块方法
5.1 通用方式:sys.path.append(目标文件所在的路径)
5.2 利用from...import句式
from aaa.bbb.ccc import 模块名
from aaa.bbb.ccc.模块名 import 模块名的名称空间的名字
浙公网安备 33010602011771号