第 42 课 · 阶段七 · 进阶主题
标准库精选
标准库里还藏着一批“神器”:collections 的数据结构、itertools 的迭代工具、functools 的函数工具。这一课一次性解锁。
🎯 学完本课你将掌握
- 掌握 collections 的 Counter、defaultdict、namedtuple
- 会用 itertools 的 chain、product、permutations
- 了解 functools 的 lru_cache 与 partial
一、collections.Counter:计数神器
Counter 用法.py
1from collections import Counter23words = "aabbbcccc"4c = Counter(words)5print(c) # Counter({'c': 4, 'b': 3, 'a': 2})6print(c.most_common(2)) # [('c', 4), ('b', 3)] 出现最多的前27print(c["a"]) # 2二、collections.defaultdict:带默认值的字典
访问不存在的键时不再报 KeyError,而是自动创建默认值,适合统计场景。
defaultdict.py
1from collections import defaultdict23# 默认值是 int 04d = defaultdict(int)5d["a"] += 16d["a"] += 17d["b"] += 18print(d) # defaultdict(<class 'int'>, {'a': 2, 'b': 1})910# 默认值是 list11d2 = defaultdict(list)12d2["语文"].append(92)13d2["语文"].append(88)14print(d2) # {'语文': [92, 88]}三、collections.namedtuple:带名字的元组
namedtuple.py
1from collections import namedtuple23Point = 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 chain2a = [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 product2# 两个列表的所有组合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, combinations23print(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_cache23@lru_cache(maxsize=None)4def fib(n):5 if n <= 1:6 return n7 return fib(n - 1) + fib(n - 2)89print(fib(100)) # 354224848179261915075 秒出结果!八、functools.partial:固定部分参数
partial.py
1from functools import partial23def power(base, exp):4 return base ** exp56square = partial(power, exp=2) # 固定 exp=27cube = partial(power, exp=3)8print(square(5)) # 259print(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 固定参数)。都是高频实战神器。