模块(包)
目录
一、什么是模块
模块是一系列功能的集合体,可以看成是一堆函数的集合体。
二、模块的四种形式
1、自定义模块
自定义代码,如果你自己写一个py文件,在文件内写入一堆函数,则它被称为自定义模块,即使用python编写的.py文件
2、第三方模块
就是pip安装的模块,已被编译为共享库或DLL的C或C++扩展
3、内置模块
python解释器启动自带的模块,是使用C编写并链接到python解释器的模块
4、包
4.1 包的定义
- 本质就是模块,实际上就是一个含有__init__.py文件的文件夹
- 导包就是导入__init__.py文件
- 包一定是被当作模块文件导入,模块文件的搜索路径以执行文件的路径为准
4.2 绝对导入和相对导入
只能在包中使用
绝对导入:
from 包名.模块名 import 方法名
相对导入:
. 代表当前被导入文件所在的文件夹
.. 代表当前被导入文件所在的文件夹的上一级
... 代表当前被导入文件所在的文件夹的上一级的上一级
二、import和from。。。import。。。
1.import
import time
- 开辟内存空间,内存空间命名为time
- 把time.py中的所有代码读入名称空间,然后运行
- 通过time.方法名使用time模块中的方法
优点:永不冲突
缺点:每次导入多输入几个字符,非常麻烦
2.from。。。import。。。
from time import sleep
- 开辟内存空间,内存空间命名为time
- 把time.py中的所有代码读入名称空间,然后运行
- 把sleep()读入import和from...import.py中,因此可以直接使用方法名
优点: 少输入几个字符
缺点: 容易发生冲突
3.导入多个功能
导入多个方法:
from time import sleep, time # 特定导入一些功能
导入所有方法:
from time import * # *导入了所有的功能
三、循环导入
就是两个文件互相将对方作为模块文件调用,你调用我,我调用你,你再调用我。。。反反复复,子子孙孙无穷匮也
# m1
x = 10
from m2 import y
print('m1:', x, y)
# m2
y = 20
from m1 import x
print('m2:', x, y)
执行m2:
m2: 10
m1: 20
m2: 10
我们发现:模块永远只会开辟一次,只要是第二次调用,就忽略开辟空间语句执行下面的代码。
四、模块的搜索路径
内存 --> 内置 --> 自定义
导入模块时查找模块的顺序是:
- 先从内存中已经导入的模块中寻找
- 内置的模块
- 环境变量sys.path中找
五、python文件的两种用途
python文件总共有两种用途,一种是执行文件;另一种是被当做模块导入。
编写好的一个python文件可以有两种用途:
- 脚本,一个文件就是整个程序,用来被执行
- 模块,文件中存放着一堆功能,用来被导入使用、
# aaa.py
x = 1
def f1():
print('from f1')
def f2():
print('from f2')
f1()
f2()
# run.py
import aaa
如果直接运行run.py会直接运行aaa.py中的f1()
和f2()
,但是如果我们在aaa.py中加上if __name__ == '__main__':
这句话,则可以防止运行run.py时执行f1()
和f2()
。因为当aaa.py被直接执行,即当做执行文件的时候__name__ == '__main__'
; 在aaa.py被当做模块直接运行的时候__name__ == 'aaa'
。由此可以让aaa.py在不同的场景下有着不同的用法。
# aaa.py
x = 1
def f1():
print('from f1')
def f2():
print('from f2')
if __name__ == '__main__':
f1()
f2()
# run.py
import aaa