Python 的一个重要优势,就是标准库足够丰富。很多看起来需要自己从头写的能力,标准库里其实早就给出了成熟而优雅的方案。
这一节我们会先聚焦三个高频模块:collections、itertools 和 functools。它们分别从容器表达、迭代处理和函数工具三个方向,帮你把代码写得更简洁、更强大,也更像真正的 Python。
为什么要优先掌握标准库?
标准库之所以重要,不只是因为“现成能用”,而是因为它往往代表了 Python 社区对某类问题的主流解法。
如果一个能力标准库已经有了成熟实现,你再自己重写一遍,通常会带来两个问题:
- 成本更高;
- 可读性更差,因为别人不一定能立刻认出你的轮子在做什么。
所以优先掌握标准库,本质上是在学习 Python 生态已经验证过的表达方式。
collections:让容器表达更准确
collections 的价值,在于它让“容器”不再只有列表和字典两种粗糙选项,而是能更贴合问题语义。
defaultdict
当你需要“键不存在时自动给一个默认值”时,defaultdict 会非常顺手:
from collections import defaultdict
grouped = defaultdict(list)
for word in ["python", "pyright", "fastapi"]:
grouped[word[0]].append(word)这比每次都手动判断键是否存在更自然,也更不容易漏逻辑。
Counter 与 deque
Counter 适合做计数:
from collections import Counter
counter = Counter(["a", "b", "a"])它让“统计频次”这个高频需求变成一句很清楚的话。
deque 则适合高效地从两端插入和弹出,常用于队列、滑动窗口、广度优先搜索等场景。
这说明容器的重点从来不是“我会不会用列表”,而是“我能不能选到最贴合问题的数据结构”。
itertools:处理迭代数据的利器
itertools 很适合和我们前面讲的迭代器、生成器放在一起理解。它提供了一批专门处理可迭代数据流的工具。
chain、product 与 groupby
chain 可以把多个可迭代对象串起来:
from itertools import chain
items = chain([1, 2], [3, 4])product 可以生成笛卡尔积,适合组合枚举场景。
groupby 则能按某个键把连续元素分组,不过它特别需要注意排序和连续性语义,不适合把它简单理解成 SQL 里的分组。
itertools 的价值,不在于让代码显得“函数式”,而在于它让很多流式处理步骤能用很轻的代价表达出来。
functools:函数式工具补充
functools 更像是一组围绕函数使用体验的辅助工具。
partial、reduce 与 lru_cache
partial 适合提前固定部分参数,生成一个更专用的函数:
from functools import partial
int_base_2 = partial(int, base=2)reduce 适合把一个序列累积折叠成一个结果,不过在 Python 里,很多场景下 sum()、普通循环或更显式的写法往往可读性更好,所以它不是默认首选。
lru_cache 则非常实用,可以给纯函数式计算结果加缓存:
from functools import lru_cache
@lru_cache
def fib(n):
if n < 2:
return n
return fib(n - 1) + fib(n - 2)它在递归计算、重复查表、稳定输入结果复用等场景里都非常有价值。
总结与预告
这一节我们见识到了标准库工具箱的威力:很多原本需要自己手写的能力,其实早就有成熟方案。掌握这些工具,不只是能少写代码,更是能更自然地顺着 Python 的表达方式思考。
下一节我们会继续补齐另一组更偏工程侧的标准库模块,把时间、日志、子进程和路径处理放到一起理解。