今日主要内容

1.  模块:模块的概念

2.  导入的方式    import      from ... inport ...

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

  名称空间(*****)、绝对导入、起别名

3.  环境变量:sys.path(*****)

4.  导入模块

 

1.  模块

常见的四种模块(module)

1.  使用python编写的.py文件

2.  把一系列模块组织到一个文件夹(注:文件夹下有一个__init__.py文件,该文件称之为包)

3.  使用C编写并链接到python解释器的内置模块

4.  已被编译为共享库或DLL的活C++扩展

 

1.1  什么是模块:一系列功能的集合体

 

1.2  为什么会出现模块

很多相似的功能,要统一管理,将这些功能放在一个文件夹中,该文件就是管理这些功能的集合体

这样可以极大提升开发效率

 

1.3  怎么使用模块

在要使用模块功能的文件中导入模块:import 模块名   

 

1.4  在哪使用模块

在所有要使用模块的功能的文件中导入并使用模块

 

 

2.  导入的方式

2.1  导入模块完成的三件事

2.1.1  首次导入

import 模块名

1.  将被导入的模块编译形成对应的pyc文件

2.  进入模块,从上往下执行模块中的代码,将产生的所有名字存放在该米快文件的全局名称空间中

3.  在使用模块的文件中,产生一个模块名(模块文件名)相同的名字,指向模块的全局名称空间

 

总结import导入模块:在使用时必须加上前缀:模块名

优点:指名道姓地想摸一个名称空间要名字,肯定不会与当前名称空间中的名字冲突

缺点:但凡应用模块中的名字都需要加前缀,不够简洁

2.1.2  再次导入

不再执行导入步骤的前两步,只会走第三部,在当前模块中产生一个名字,指向第一次导入在内存中产生的全局名称空间

 

2.2  起别名

import 模块名 as 别名

导入一旦起别名,原模块名变量失效,本质上产生了别名变量指向模块文件的全局名称空间

 

2.3  模块的分类

大方向:内置(built - in)

    自定义(系统提供、第三方提供、自己自定义)

 

2.4 from ... inport语法导入

导入完成三件事:

1.  将被导入的模块编译形成对应的pyc文件

2.  进入模块,从上往下执行模块中的代码,将产生的所有宁子存放在该米快文件的全局名称空间中

3.  在导入模块的文件中形成(一个或者多个)名字指向模块全局名称空间中的(一个或多个)具体名字

 

from 模块名 import 模块中的名字1, ... ,模块中的名字

from 模块名 import 名字 as 别名

 

from ... import 导入依赖环境变量 sys.path

 

2.5  from ... import *

 模块中默认会添加__all__,__all__就是管理模块中能被*导入的变量们

__all__可以自定义,自定义*能导入的变量们,__all__的list中名字全部可以自定义

 

系统默认的__all__中不会纳入_开头的名字,所以from...inport*无法导入—_开头的名字

3.  模块的加载顺序

内存 > 内置 > sys.path(安装环境变量中路径的先后顺序逐一加载)

 

环境变量

环境变量:存放路径的list,第一位默认一定是当前执行文件所在的路径

import sys
print(sys.path) # sys.path就是环境变量
sys.path.clear() # 清空环境变量,所有的导入都不能用了
print(sys.path) # []

sys.path.append() # 添加指定路径到环境变量
sys.path.insert()

 4.  导入模块

4.1  链式导入

t1 导入 m1,m1导入m2,m2导入m3

执行流程:执行t1,在t1导入m1模块的低昂直接进入m1,去执行m1,同理在m1执行过程中遇到导入m2,会马上就如m2,去执行m2,一直到m3,m3执行完毕,会回到m2中导入m3的语句,接着往下执行m2,m2执行完毕回到m1,一次类推返回到t1

 

在整个执行流程中,遇到任何模块的二次导入,都是直接引用内存中的名称空间,不会再次进入模块

 

4.2 循环导入

循环导入的问题点:名字没有产生就使用名字

解决循环导入:先产生名字,再导入模块,即将会产生循环导入的模块,导入语法延后,延后导入

# 问题
# m1.py
import m2
print(m2.y)
x = 666

# m2.py
import m1
print(m2.x)
y = 888

 

# 解决
# m1.py
x = 666
import m2
print(m2.y)


# m2.py
y = 888
import m1
print(m2.x)

 

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄