模块
常见的四种模块:
1、使用python编写的.py文件
2、把一系列模块组织到一起的文件夹(注:文件夹下有一个__init__.py文件,该文件夹称之为包)
3、使用C编写并连接到python解释器的内置模块
4、已被编译为共享库或DLL的C或C++扩展
#1、定义:一系列功能的集合体(把一系列功能集合到同一个文件中)
#2、为什么出现模块:很多相似的功能,需要统一管理,将这些功能放在一个文件夹中,该文件就是管理这些功能的集合体,我们命名为模块
#3、怎么使用模块:
--在要使用模块功能的文件中导入模块:import 模块名 -这个模块名就是用来管理一系列功能的文件名
#4、在哪使用模块:
--在所有要使用模块中功能的文件中导入并使用模块
导入模块完成的三件事
--都是绝对路径导入
#首次导入 import 模块名
1、将被导入模块编译形成对应的pyc文件
2、进入模块,从上往下执行模块中的代码,将产生的所有名字存在在该模块文件的全局名称空间中
3、在使用模块的文件中产生一个与模块名同名的名字,指向模块的全局名称空间
# import m2 #
#再次导入
不会走前两步,直接走第三步,在使用模块的文件中产生一个与模块同名的名字,指向模块的全局名称空间
首次导入会把导入的模块存入内存,再次导入直接在内存中找,就不会进入模块内部再执行一遍了
起别名
import 模块名 as 别名
有些模块名字比较长,起个简短的别名方便后续的调用
需要注意的是:一旦起别名,之前的模块名就失效了,本质上只产生了别名变量指向模块的全局名称空间
模块的分类
大方向分类:内置模块(Built-in) | 自定义模块
自定义又可分为:系统提供 | 第三方提供 | 自己自定义
模块加载的顺序
内存 > 内置 > sys.path(安装环境变量中路径的先后顺序)
#环境变量sys.path就是一个列表,里面路径的顺序决定自定义加载的顺序
环境变量
环境变量:存放路径的list,第一位默认一定是当前执行文件所在的路径
#环境变量随着项目的运行而产生,存活于内存中,项目运行结束而消失,一旦形成,不管在项目下的那个地方看sys.path都是一样的
import sys
#sys.path就是环境变量
sys.path.clear()
#清空环境变量,所有自定义导入都不能使用
#报错信息:No module named 'm2'
sys.path.append()
sys.path.insert()
#添加指定路径到环境变量中
from...import语法导入
导入完成三件事
1、将被导入的模块编译形成对应的pyc文件
2、进入模块,从上往下执行模块中的代码,将产生的所有名字存放在该模块的全局名称空间中
3、再导入模块的文件中形成(一个或者多个)名字指向模块全局名称空间的(一个或多个)具体名字
from 模块名 import 模块中的名字1...模块中的名字n
from 模块名 import 名字1 as 别名1,名字2 as 别名2
#from ...import导入依赖环境变量sys.path
#sys.path如果清空,导入就会报错
from ...import *
#模块中会默认添加__all__, __all__就是管理模块中能被*导入的变量们
__all__可以自定义,自定义*能导入的变量们,__all__的list中名字全部可以自定义
__all__ = ['a','b','c','d_','_e']
#系统默认添加的__all__中不会纳入 _开头的名字
# --所以默认再外界通过from...import * 无法导入_开头的名字
# --_开头的名字对from...import * 是隐藏的,指名道姓依然可以被外界导入使用(把名字加入__all__中)
链式导入
t1导入m1 ,m1导入m2 ,m2导入m3
执行流程:右键执行t1,在t1导入m1模块的地方直接进入m1,同理m1执行过程遇到导入m2,
会马上进入m2,去执行m2,一直到m3,m3执行完毕,会回到m2中导入m3的语句,接着往下执行,
m2执行完毕会回到m1导入m2的语句,以此类推,一直返回到t1,然后执行完毕。
#在整个执行流程中,遇到任何模块二次导入都不会进入模块,而是直接引用内存中的名称空间
循环导入
循环导入:就是在被导入模块中接着导入当前模块
遇到的基本问题:名字没有产生就是用名字(就会报错)
解决循环导入的问题:先产生名字,再导入模块
--将会产生循环导入的模块 导入语法延后 -延后导入
问题案例:
#m1.py
import m2
print(y)
x = 100
#m2.py
import m1
print(x)
y = 200
#####解决的方法就是把变量定义提到模块导入之前