模块与导入

Python 的一大特点是很多功能开箱即用。printlenlistdictsortedmaxmin 这些内置函数和类型,不需要 import 任何东西就能直接用。

但当你需要更强大的功能时,比如数学运算、堆操作、二分查找等,就要用 import 来导入标准库模块了。这篇文章来讲讲 Python 的模块和导入机制。

什么是模块

在 Python 中,一个 .py 文件就是一个模块,文件名就是模块名。

比如你写了一个 math_utils.py,那它就是一个叫 math_utils 的模块。其他文件可以通过 import math_utils 来使用里面的函数。

Python 自带了大量标准库模块,覆盖了数学运算、数据结构、文件操作等方方面面。你不需要安装任何东西,直接 import 就能用。

import 的几种写法

Python 的 import 有好几种写法,各有各的适用场景:

还有一种写法是 from math import *,把模块里所有东西都导入进来。但不推荐这样做,因为你不知道导入了哪些名字,可能和你自己定义的变量冲突。

总结一下:

写法使用方式适用场景
import mathmath.sqrt()最常用,清晰不冲突
from math import sqrtsqrt()某个函数用得特别多
import math as mm.sqrt()模块名太长时
from math import *sqrt()不推荐

刷题常用标准库模块一览

下面列出刷题中最常用的标准库模块,让你知道"有哪些东西可以用"。具体的用法和示例会在后续的 常用数据结构算法题常用技巧 章节中详细介绍。

模块用途典型函数/类
math数学函数sqrtgcdinfceil/floor
collections高级容器dequedefaultdictCounter
heapq堆操作heappushheappop
bisect二分查找bisect_leftbisect_right
itertools迭代器工具permutationscombinations
functools函数工具lru_cachecmp_to_key
sys系统相关sys.stdin(快读)、sys.maxsize

再提醒一下:listdictsetstrint 等内置类型,以及 lenrangesortedmax/minsumabs 等内置函数,不需要导入,直接用就行。

包(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 的函数写法很灵活,支持默认参数、多返回值,还有列表推导式这个写算法题时非常好用的语法糖。