模块(包) 一、什么是模块 二、模块的四种形式 二、import和from。。。import。。。 三、循环导入 四、模块的搜索路径 五、python文件的两种用途

模块是一系列功能的集合体,可以看成是一堆函数的集合体。

二、模块的四种形式

1、自定义模块

自定义代码,如果你自己写一个py文件,在文件内写入一堆函数,则它被称为自定义模块,即使用python编写的.py文件

2、第三方模块

就是pip安装的模块,已被编译为共享库或DLL的C或C++扩展

3、内置模块

python解释器启动自带的模块,是使用C编写并链接到python解释器的模块

4、包

4.1 包的定义

  1. 本质就是模块,实际上就是一个含有__init__.py文件的文件夹
  2. 导包就是导入__init__.py文件
  3. 包一定是被当作模块文件导入,模块文件的搜索路径以执行文件的路径为准

4.2 绝对导入和相对导入

只能在包中使用

绝对导入:

from 包名.模块名 import 方法名

相对导入:

.    代表当前被导入文件所在的文件夹

..   代表当前被导入文件所在的文件夹的上一级

...  代表当前被导入文件所在的文件夹的上一级的上一级

二、import和from。。。import。。。

1.import

import time
  1. 开辟内存空间,内存空间命名为time
  2. 把time.py中的所有代码读入名称空间,然后运行
  3. 通过time.方法名使用time模块中的方法

优点:永不冲突

缺点:每次导入多输入几个字符,非常麻烦

2.from。。。import。。。

from time import sleep
  1. 开辟内存空间,内存空间命名为time
  2. 把time.py中的所有代码读入名称空间,然后运行
  3. 把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

我们发现:模块永远只会开辟一次,只要是第二次调用,就忽略开辟空间语句执行下面的代码。

四、模块的搜索路径

内存 --> 内置 --> 自定义

导入模块时查找模块的顺序是:

  1. 先从内存中已经导入的模块中寻找
  2. 内置的模块
  3. 环境变量sys.path中找

五、python文件的两种用途

python文件总共有两种用途,一种是执行文件;另一种是被当做模块导入。

编写好的一个python文件可以有两种用途:

  1. 脚本,一个文件就是整个程序,用来被执行
  2. 模块,文件中存放着一堆功能,用来被导入使用、
# 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