# 模块的导入与创建

URL: https://caijiao.org/python/ch06/import
Source: docs/python/ch06/import.md
Description: 本章介绍 Python 模块的导入方式、自定义模块的创建方法，以及模块搜索路径等知识，帮助读者掌握模块化编程的基本能力。

模块是 Python 中组织代码的一种方式，它可以让代码结构更加清晰、可复用性更强。本章将介绍如何导入标准模块、自定义模块，以及模块的组织结构和搜索路径。

## 什么是模块

模块是一个以 `.py` 结尾的 [Python](/python/) 文件，其中包含了变量、函数、类等定义。通过模块，我们可以把相关功能组织在一起，便于管理和调用。

## 导入模块的方式

Python 提供多种方式导入模块：

```python
import math
print(math.sqrt(16))  # 输出：4.0

from math import sqrt
print(sqrt(25))  # 输出：5.0

import math as m
print(m.pi)  # 输出：3.141592653589793
```

## 模块的搜索路径

当导入模块时，Python 会按照以下顺序查找模块：

1. 当前目录
2. 环境变量 `PYTHONPATH` 指定的目录
3. 标准库目录

可以通过以下方式查看模块搜索路径：

```python
import sys
print(sys.path)
```

## 创建自定义模块

我们可以自己编写 `.py` 文件作为模块：

**mymodule.py**

```python
def greet(name):
    return f"Hello, {name}!"
```

然后在其他文件中使用它：

```python
import mymodule
print(mymodule.greet("Python"))
```

## 使用 `__name__ == "__main__"` 控制模块行为

可以使用以下语法，让模块在被导入时不执行某些代码：

```python
def main():
    print("模块被直接运行")

if __name__ == "__main__":
    main()
```

当模块作为脚本直接运行时，`__name__` 为 `"__main__"`；作为模块被导入时，`__name__` 为模块名。

## 包（Package）的概念

包是包含 `__init__.py` 文件的目录，它可以包含多个模块，形成一个命名空间结构：

```
mypackage/
  ├── __init__.py
  ├── module1.py
  └── module2.py
```

使用方式：

```python
from mypackage import module1
```

## 总结

- 模块是组织代码的重要工具，支持导入与重用。
- Python 支持多种导入语法，也允许创建自己的模块。
- 使用 `__name__ == "__main__"` 可以控制模块执行逻辑。
- 包是一组模块的集合，适用于更复杂的项目结构。
