第 42 课 · 阶段七 · 进阶主题

标准库精选

标准库里还藏着一批“神器”:collections 的数据结构、itertools 的迭代工具、functools 的函数工具。这一课一次性解锁。

第 42 课阶段七 · 进阶主题难度:进阶建议时长:40 分钟关键词:collections · itertools · functools

🎯 学完本课你将掌握

  • 掌握 collections 的 Counter、defaultdict、namedtuple
  • 会用 itertools 的 chain、product、permutations
  • 了解 functools 的 lru_cache 与 partial

一、collections.Counter:计数神器

Counter 用法.py
1from collections import Counter
2
3words = "aabbbcccc"
4c = Counter(words)
5print(c) # Counter({'c': 4, 'b': 3, 'a': 2})
6print(c.most_common(2)) # [('c', 4), ('b', 3)] 出现最多的前2
7print(c["a"]) # 2

二、collections.defaultdict:带默认值的字典

访问不存在的键时不再报 KeyError,而是自动创建默认值,适合统计场景。

defaultdict.py
1from collections import defaultdict
2
3# 默认值是 int 0
4d = defaultdict(int)
5d["a"] += 1
6d["a"] += 1
7d["b"] += 1
8print(d) # defaultdict(<class 'int'>, {'a': 2, 'b': 1})
9
10# 默认值是 list
11d2 = defaultdict(list)
12d2["语文"].append(92)
13d2["语文"].append(88)
14print(d2) # {'语文': [92, 88]}

三、collections.namedtuple:带名字的元组

namedtuple.py
1from collections import namedtuple
2
3Point = namedtuple("Point", ["x", "y"])
4p = Point(3, 5)
5print(p.x, p.y) # 3 5 像属性一样访问
6print(p[0]) # 3 也能当下标

四、itertools.chain:拼接多个可迭代对象

chain 用法.py
1from itertools import chain
2a = [1, 2]
3b = [3, 4]
4c = "ab"
5print(list(chain(a, b, c))) # [1, 2, 3, 4, 'a', 'b']

五、itertools.product:笛卡尔积

product 用法.py
1from itertools import product
2# 两个列表的所有组合
3for x, y in product([1, 2], ["a", "b"]):
4 print(x, y)
5# (1,a) (1,b) (2,a) (2,b)

六、itertools.permutations 与 combinations

排列组合.py
1from itertools import permutations, combinations
2
3print(list(permutations([1, 2, 3], 2))) # 排列:顺序有关
4print(list(combinations([1, 2, 3], 2))) # 组合:顺序无关

七、functools.lru_cache:自动缓存

给递归函数加 @lru_cache,重复计算自动缓存,性能暴涨。

lru_cache.py
1from functools import lru_cache
2
3@lru_cache(maxsize=None)
4def fib(n):
5 if n <= 1:
6 return n
7 return fib(n - 1) + fib(n - 2)
8
9print(fib(100)) # 354224848179261915075 秒出结果!

八、functools.partial:固定部分参数

partial.py
1from functools import partial
2
3def power(base, exp):
4 return base ** exp
5
6square = partial(power, exp=2) # 固定 exp=2
7cube = partial(power, exp=3)
8print(square(5)) # 25
9print(cube(5)) # 125

九、常见错误与解决

常见错误与解决

错误现象原因 / 解决方法
defaultdict 打印带 class 信息print 显示 defaultdict(, {...}) 是正常现象,照常使用。
permutations 结果太多排列组合数量随 n 阶乘增长,注意别算太大。
lru_cache 加在错误函数上装饰器要加在被调用的递归函数上,且参数需可哈希。
✍️ 小练习
用 Counter 统计一篇文章的词频并输出前 5;用 product 生成两个列表的坐标组合;用 lru_cache 加速斐波那契并对比耗时。
📌 本节小结
collections 补强数据结构(Counter 计数、defaultdict 默认值、namedtuple 命名元组),itertools 玩转迭代(chain、product、permutations、combinations),functools 提升函数(lru_cache 缓存、partial 固定参数)。都是高频实战神器。