Python脱产8期 Day016 2019/5/5
一 模块
1.什么是模块:一系列功能的集合体。
2.常见的四种模块
SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。1.使用python编写的.py文件
2.把一系列模块组织到一起的文件夹(注:文件夹下有一个_int_.py文件,该文件夹称之为包)
3.使用c编写并连接到python解释器的内置模块
4.已被编译为共享或DLL的C或c++扩展
二 模块的加载顺序
搜索顺序:内存 => 内置模块 => sys.path
1.导入模块会优先在内存中查找
2.内存中没有被加载的话,再去查找内置模块
3.还没有查找到,就根据sys.path中的路径顺序逐一查找
三 模块导入的执行流程
首次导入:
1.将被导入的模块编译对应的pyc文件
2.进入模块,从上执行模块中的代码,将产生的所有名字存放在模块文件的全局名称空间中
3.在使用模块的文件中,产生一个与模块名(模块文件名)同名的名字,指向模块的全局名称空间
再次导入
1.不再执行导入模块的前2步,只会走第三步,在当前模块中产生一个名字,指向第一次导入在内存中产生的全局名称空间
四 起别名
import 模块名 as 别名 #重点:导入一旦起别名,原模块名变量失效,本质只产生了别名变量指向模块文件的全局名称空间
五 模块的分类
大方向:内置(built-in) | 自定义(系统提供 | 第三方提高 | 自己自定义)
六 环境变量
# 环境变量:存放路径的list,第一位默认一定是当前执行文件所在的路径
import sys
# sys.path就是环境变量
# 清空环境变量:所有导入都不能使用了
sys.path.clear()
# 添加指定路径到环境变量
sys.path.append()
sys.path.insert()
七 from...import语法导入
导入完成的三件事
# 1.将被导入的模块编译形成对应的pyc文件
# 2.进入模块,从上执行执行模块中的代码,将产生的所有名字存放在该模块文件的全局名称空间中
# 3.在导入模块的文件中形成(一个或多个)名字指向模块全局名称空间中的(一个或多个)具体名字
from 模块名 import 模块中的名字1, ..., 模块中的名字n
from 模块名 import 名字 as 别名
# from...import导入依赖环境变量 sys.path
八 from...import *
# 模块中默认会添加 __all__ ,__all__ 就是管理模块中能被 * 导入的变量们
# __all__可以自定义,自定义 * 能导入的变量们, __all__的list中名字全部可以自定义
__all__ = ['a', 'b', 'c', 'd_', '_e']
# 系统默认添加的__all__中不会纳入 _开头的名字
# -- 所以默认在外界通过from...import *无法导入_开头的名字
# -- _开头的名字对from...import *是隐藏的,指名道姓依然可以被外界导入使用
链式导入
# t1导入m1,m1导入m2,m2导入m3
# 执行流程:右键执行t1,在t1导入m1模块的地方直接进入m1,去执行m1,同理在m1执行过程中遇到导入m2,会马上进入m2,去执行m2,一直到m3,m3执行完毕,会回到m2中导入m3的语句,接着往下执行m2,m2执行完毕回到m1,以此类推返回到t1
# 在整个执行流程中,遇到任何模块的二次导入,都是直接引用内存中的名称空间,不会再次进入模块
循环导入
# 循环导入的问题点:名字没有产生就使用名字
# 解决循环导入:先产生名字,在导入模块
# -- 将会产生循环导入的模块,导入语法延后 - 延后导入
# m1.py
x = 666
import m2
print(m2.y)
# m2.py
y = 888
import m1
print(m2.x)
