# 模块

一个以`.py`为后缀的 Python 文件就是一个模块，模块中可以包含变量、函数、类、以及可执行代码。

## 模块的分类

<table><thead><tr><th width="162.0546875">类型</th><th width="397.3984375">说明</th><th>示例</th></tr></thead><tbody><tr><td>内置模块</td><td>Python 解释器自带，无需安装，直接导入即可使用</td><td><code>os</code>、<code>sys</code>、<code>math</code></td></tr><tr><td>第三方模块</td><td>需要通过 <code>pip</code> 安装后才能使用的模块（社区贡献）</td><td><code>requests</code>、<code>numpy</code></td></tr><tr><td>自定义模块</td><td>开发者自己编写的 <code>.py</code> 文件，用于封装自有功能</td><td><code>my_utils.py</code></td></tr><tr><td>包（Package）</td><td>包含 <code>__init__.py</code> 文件的文件夹，用于组织多个相关模块（模块的集合）</td><td><code>pandas/</code>（内置多个子模块）</td></tr></tbody></table>

## 导入模块

* 方式一：导入整个模块

```python
import math

print(math.pi)    # 输出圆周率
print(math.sqrt(16))    # 输出 4.0
```

* 方式二：导入模块并指定别名

```python
import numpy as np
import pandas ad pd

arr = np.array([1, 2, 3])
```

* 从模块中导入指定功能（函数/类/变量）

```python
from math import pi, sqrt

print(pi)
print(sqrt(16))
```

* 方式四：从模块中导入指定功能并指定别名。

```python
from math import sqrt as square_root

print(square_root(16))
```

* 导入模块中的所有功能（不推荐）

```python
from math import *

print(sin(0))
```

## 模块的查找路径&#x20;

* 当前执行脚本所在目录
* 系统环境变量 `PYTHONPATH` 指定的目录
* Python 安装目录下的 `site-packages`（第三方模块安装目录）
* 标准库目录

## 模块的加载机制

* Python 中**同一个模块只会被加载一次**（即使多次导入），避免重复执行模块代码。
* 如果需要重新加载模块（如调试时修改了模块代码），可使用 `importlib.reload()`：
* 缓存：模块被导入后，会被换存在`sys.modules`字典中。后续导入同一模块时，会直接使用缓存，不再执行模块代码。
