Python 的一大特点是很多功能开箱即用。print、len、list、dict、sorted、max、min 这些内置函数和类型,不需要 import 任何东西就能直接用。
但当你需要更强大的功能时,比如数学运算、堆操作、二分查找等,就要用 import 来导入标准库模块了。这篇文章来讲讲 Python 的模块和导入机制。
什么是模块
在 Python 中,一个 .py 文件就是一个模块,文件名就是模块名。
比如你写了一个 math_utils.py,那它就是一个叫 math_utils 的模块。其他文件可以通过 import math_utils 来使用里面的函数。
Python 自带了大量标准库模块,覆盖了数学运算、数据结构、文件操作等方方面面。你不需要安装任何东西,直接 import 就能用。
import 的几种写法
Python 的 import 有好几种写法,各有各的适用场景:
还有一种写法是 from math import *,把模块里所有东西都导入进来。但不推荐这样做,因为你不知道导入了哪些名字,可能和你自己定义的变量冲突。
总结一下:
| 写法 | 使用方式 | 适用场景 |
|---|---|---|
import math | math.sqrt() | 最常用,清晰不冲突 |
from math import sqrt | sqrt() | 某个函数用得特别多 |
import math as m | m.sqrt() | 模块名太长时 |
from math import * | sqrt() | 不推荐 |
刷题常用标准库模块一览
下面列出刷题中最常用的标准库模块,让你知道"有哪些东西可以用"。具体的用法和示例会在后续的 常用数据结构 和 算法题常用技巧 章节中详细介绍。
| 模块 | 用途 | 典型函数/类 |
|---|---|---|
math | 数学函数 | sqrt、gcd、inf、ceil/floor |
collections | 高级容器 | deque、defaultdict、Counter |
heapq | 堆操作 | heappush、heappop |
bisect | 二分查找 | bisect_left、bisect_right |
itertools | 迭代器工具 | permutations、combinations |
functools | 函数工具 | lru_cache、cmp_to_key |
sys | 系统相关 | sys.stdin(快读)、sys.maxsize |
再提醒一下:list、dict、set、str、int 等内置类型,以及 len、range、sorted、max/min、sum、abs 等内置函数,不需要导入,直接用就行。
包(Package)与 __init__.py
当你的代码量更大时,一个文件可能不够用,需要把多个模块组织到一个目录里。在 Python 中,一个包含 __init__.py 的目录就是一个包(Package)。
my_project/
├── main.py
└── utils/
├── __init__.py # 标记 utils 是一个包
├── math_utils.py # 数学工具模块
└── string_utils.py # 字符串工具模块__init__.py 可以是一个空文件,它的作用仅仅是告诉 Python"这个目录是一个包,里面的 .py 文件可以被 import"。
导入方式和模块一样:
# 导入包中的特定模块
from utils.math_utils import factorial
# 或者导入整个模块
import utils.math_utils as mu
mu.factorial(5)下面是一个完整的多文件项目示例:
了解了模块和导入之后,下一篇我们来讲 函数与列表推导式。Python 的函数写法很灵活,支持默认参数、多返回值,还有列表推导式这个写算法题时非常好用的语法糖。