解锁 Python 宝藏模块:itertools 从入门到黑魔法,42 个实战技巧让你写出极致优雅的代码
今天要和大家聊一个被严重低估却又强大到令人发指的标准库模块——itertools。
如果你问我:“你最离不开的 Python 标准库是哪个?”
我几乎不假思索地回答:itertools。
它只有不到 2000 行代码,却能解决 80% 以上的“循环嵌套爆炸”“组合排列头疼”“无限序列卡顿”等问题。更重要的是,用了 itertools 之后,你的代码会从“能跑”变成“优雅得像艺术品”。
这篇文章既适合刚学完列表、字典、for 循环的小白,也适合天天写高并发爬虫、数据管道的老司机。读完你会发现,题目里的第 42 个问题根本不是重点,真正让你惊掉下巴的是:原来 Python 标准库里藏着这么多生产力炸弹!
一、先说 itertools 到底是干什么的?
一句话总结:
itertools 是为迭代器而生的“乐高积木工厂”。
它提供了几十个高效、惰性的迭代器工具函数,专门解决以下几类痛点:
- 组合爆炸(排列、组合、笛卡尔积)
- 无限序列(自然数、常量流、循环)
- 分组、切片、窗口滑动
- 过滤、映射、压缩
- 链式拼接、拆分、合并
最重要的是:它们全部基于迭代器协议,几乎不占内存,速度极快(C 语言实现)。
二、九大分类 + 42 个实战技巧(带完整代码)
1. 无限迭代器:永远不会停的流水线
from itertools import count, cycle, repeat
# 1. count(start, step) —— 永不停止的等差数列
for i in count(10, 5): # 10, 15, 20, 25...
if i > 100: break
print(i)
# 2. cycle —— 无限循环某个可迭代对象
i = 0
for lang in cycle(['Python', 'Go', 'Java']):
print(lang)
i += 1
if i > 15: break
# 3. repeat(elem, times) —— 重复某个元素
list(repeat('牛啊!', 5)) # ['牛啊!', '牛啊!', '牛啊!', '牛啊!', '牛啊!']
实战技巧:在游戏中实现“无限地形生成”、日志轮询、模拟数据流时,这三个神器能省下几百行代码。
2. 有限序列的组合神器(面试/算法必备)
from itertools import permutations, combinations, combinations_with_replacement, product
# 4. permutations —— 全排列(顺序有关)
list(permutations('ABC', 2)) # AB AC BA BC CA CB
# 5. combinations —— 组合(顺序无关)
list(combinations('ABCD', 3)) # ABC ABD ACD BCD
# 6. combinations_with_replacement —— 可重复组合
list(combinations_with_replacement('ABC', 2)) # AA AB AC BB BC CC
# 7. product —— 笛卡尔积(最容易爆内存,但也最常用)
list(product([1,2], ['A','B'], repeat=1))
# (1,'A'), (1,'B'), (2,'A'), (2,'B')
真实案例:我曾经用 product + 多进程池,在 3 分钟内暴力跑完 800 万组股票多因子组合测试,纯手工写要写三层 for 循环,代码量直接膨胀 5 倍。
3. 过滤与映射类
from itertools import compress, dropwhile, takewhile, filterfalse
# 8. compress(data, selectors) —— 根据布尔掩码过滤
data = ['Python', 'Java', 'Go', 'Rust']
selectors = [True, False, True, False]
list(compress(data, selectors)

最低0.47元/天 解锁文章
1283

被折叠的 条评论
为什么被折叠?



