Python itertools 盘点真正用得上的20个常用方法
Python 标准库里藏着一个被严重低估的宝藏模块——itertools。几乎每个 Python 开发者都import过它但大多数人只用其中三四个函数剩下的就像工具箱里生锈的扳手从来没碰过。这篇报告把全部 20 个函数梳理清楚按照你在真实代码里会多频繁用到它来排序而不是照着官方文档的顺序念经。一、什么是itertools为什么值得认真学itertools是 Python 标准库中专门处理迭代器的模块灵感来自 APL、Haskell 和 SML 等函数式编程语言。它的核心哲学是构建一套迭代器代数——把简单的迭代器组合起来搭出复杂而高效的数据处理流水线。两个关键优势让它与众不同内存效率极高itertools的函数几乎全部是惰性求值lazy evaluation的也就是说数据不会一次性全部加载进内存而是用到哪块算哪块。处理一个几十 GB 的日志文件和处理一个 10 行的列表内存占用几乎没有区别。速度快底层用 C 实现比手写的 Python 循环快得多。研究表明itertools在节省内存的同时速度损耗微乎其微对绝大多数真实场景来说是非常划算的交换。理解itertools之前先要搞清楚两个概念可迭代对象Iterable能被for循环遍历的东西比如列表、字符串、字典。迭代器Iterator一种特殊的可迭代对象只能向前走不能回头调用next()一次吐出一个元素。itertools的所有函数返回的都是迭代器。二、函数全景图官方文档把 20 个函数分成三大类下面这张表是最清晰的全貌类别函数一句话描述通用迭代器chain,chain.from_iterable拼接多个可迭代对象通用迭代器islice切片迭代器通用迭代器compress按布尔掩码过滤通用迭代器filterfalse过滤掉满足条件的元素通用迭代器starmap解包参数后调用函数通用迭代器pairwise相邻两两配对3.10通用迭代器batched按批次分组3.12通用迭代器groupby按键分组需预排序通用迭代器accumulate累积计算如累加通用迭代器takewhile/dropwhile按条件截取/跳过通用迭代器tee复制迭代器通用迭代器zip_longest补齐长度的 zip无限迭代器count,cycle,repeat无限计数/循环/重复组合迭代器combinations,permutations,product,combinations_with_replacement排列组合笛卡尔积三、最常用的函数日常代码的主力军chain()和chain.from_iterable()— 拼接利器chain()是使用频率最高的函数之一把多个可迭代对象首尾相连变成一个统一的迭代器不需要真正合并成一个新列表。from itertools import chain # 把三个列表拼成一个流不占额外内存 result list(chain([1, 2], [3, 4], [5, 6])) # → [1, 2, 3, 4, 5, 6]chain.from_iterable()是它的变体专门处理列表的列表这种嵌套结构效果等同于chain(*nested)但不需要把整个嵌套列表先解包nested [[1, 2], [3, 4], [5, 6]] result list(chain.from_iterable(nested)) # → [1, 2, 3, 4, 5, 6]实际场景爬虫抓回来多页数据存在多个列表里用chain一行搞定合并比sum(lists, [])快得多。islice()— 迭代器的切片刀普通列表可以用[start:stop:step]切片但迭代器不行。islice()就是专门为迭代器设计的切片工具有一个重要限制不支持负数索引。from itertools import islice # 从无限计数器里取前5个 from itertools import count first_five list(islice(count(10), 5)) # → [10, 11, 12, 13, 14] # 跳过前3行读取第4到第10行 with open(bigfile.txt) as f: lines list(islice(f, 3, 10))处理大文件时这个函数特别好用——不用把整个文件读进内存按需取用。groupby()— 分组神器但有个大坑groupby()按照某个键把连续相同的元素分成组非常适合做数据聚合。但这里有个经典陷阱它只对连续相同的元素分组所以使用前必须先按同一个键排好序否则结果会出乎意料。from itertools import groupby data [ {name: Alice, dept: Engineering}, {name: Bob, dept: Engineering}, {name: Carol, dept: Marketing}, ] # 必须先排序 data.sort(keylambda x: x[dept]) for dept, members in groupby(data, keylambda x: x[dept]): print(dept, list(members))这个行为和 Unix 的uniq命令一模一样——只合并相邻的重复项。accumulate()— 不只是求和大多数人只知道accumulate能算累加但它接受任意二元函数可以做累积乘积、滚动最大值等各种操作from itertools import accumulate import operator nums [1, 2, 3, 4, 5] # 累加1 3 6 10 15 print(list(accumulate(nums))) # 累积乘积1 2 6 24 120 print(list(accumulate(nums, operator.mul))) # 滚动最大值1 2 3 4 5 print(list(accumulate(nums, max))) # 带初始值 print(list(accumulate(nums, initial100))) # → [100, 101, 103, 106, 110, 115]金融数据分析、游戏得分累计、滑动窗口统计这个函数都能派上用场。pairwise()和batched()— 两个为什么我以前要手写这个的函数Reddit 上那篇帖子特别点名了这两个函数因为太多人在不知道它们的情况下自己写了一堆笨拙的代码来实现同样的功能。pairwise()Python 3.10生成相邻元素的两两配对from itertools import pairwise steps list(pairwise([1, 2, 3, 4, 5])) # → [(1,2), (2,3), (3,4), (4,5)] # 计算相邻差值比如股价涨跌 prices [100, 105, 98, 110] changes [b - a for a, b in pairwise(prices)] # → [5, -7, 12]batched()Python 3.12把一个迭代器切成固定大小的批次最后一批可以比指定大小短from itertools import batched data range(10) for batch in batched(data, 3): print(batch) # → (0,1,2) (3,4,5) (6,7,8) (9,)批量调用 API、分页写数据库batched直接替代手写的[data[i:in] for i in range(0, len(data), n)]。四、进阶函数用得少但关键时刻救命starmap()— 优雅地解包参数当你有一个参数元组的列表想对每个元组调用同一个函数时starmap()比map()更优雅from itertools import starmap pairs [(2, 5), (3, 2), (10, 3)] result list(starmap(pow, pairs)) # → [32, 9, 1000] # 等价于但比下面这个更简洁 # [pow(a, b) for a, b in pairs]tee()— 复制迭代器但要小心tee(it, n)把一个迭代器复制成 n 个独立的迭代器每个都能独立遍历。听起来很美但有个内存陷阱它会在内部缓存所有已经被某个副本消费但其他副本还没读到的元素。如果两个副本的进度差很大内存消耗会很可观。from itertools import tee a, b tee([1, 2, 3, 4, 5]) # a 和 b 是独立的互不影响 print(list(a)) # → [1, 2, 3, 4, 5] print(list(b)) # → [1, 2, 3, 4, 5]原则tee之后原始迭代器就不要再用了。zip_longest()— 不丢数据的 zip内置zip()以最短的序列为准多余的元素直接丢掉。zip_longest()则以最长的为准短的用fillvalue补齐from itertools import zip_longest a [1, 2, 3, 4] b [x, y] result list(zip_longest(a, b, fillvalue-)) # → [(1,x), (2,y), (3,-), (4,-)]takewhile()和dropwhile()— 条件截断这两个函数是一对反义词都接受一个判断函数和一个序列from itertools import takewhile, dropwhile data [1, 4, 6, 3, 8] # 只要条件为真就继续取一旦为假立刻停止后面的不再检查 list(takewhile(lambda x: x 5, data)) # → [1, 4] # 跳过条件为真的从第一个为假的开始取所有剩余元素 list(dropwhile(lambda x: x 5, data)) # → [6, 3, 8]注意dropwhile的行为它跳过开头满足条件的元素但一旦开始输出后面的元素不再检查条件全部输出。五、无限迭代器小心别让程序跑死这三个函数会产生无穷无尽的元素必须配合islice()、takewhile()或zip()来截断否则程序会永远跑下去。from itertools import count, cycle, repeat # count从10开始步长2无限递增 # 10, 12, 14, 16, ... for n in count(10, 2): if n 20: break # cycle无限循环一个序列 # A, B, C, A, B, C, ... # 注意cycle 会把整个序列复制一份存在内存里 # repeat重复一个对象 n 次省略 n 则无限 list(repeat(7, 3)) # → [7, 7, 7]count和zip()配合是个经典技巧可以替代enumerate()而且步长更灵活。六、组合迭代器排列组合的数学世界这四个函数处理排列组合问题在密码学、测试用例生成、数学枚举场景里很常见。from itertools import combinations, permutations, product, combinations_with_replacement items [A, B, C] # 组合顺序无关不重复C(3,2)3种 list(combinations(items, 2)) # → [(A,B), (A,C), (B,C)] # 排列顺序有关不重复P(3,2)6种 list(permutations(items, 2)) # → [(A,B), (A,C), (B,A), (B,C), (C,A), (C,B)] # 笛卡尔积等价于嵌套 for 循环 list(product([0,1], repeat3)) # → 所有3位二进制数共8种 # 有放回组合允许重复元素 list(combinations_with_replacement(AB, 2)) # → [(A,A), (A,B), (B,B)]数学上这四者的关系可以用公式表示。对于从 n 个元素中取 r 个C(n,r)n!r!(n−r)!C(n,r)r!(n−r)!n!​P(n,r)n!(n−r)!P(n,r)(n−r)!n!​笛卡尔积的总数则是各序列长度的乘积。七、函数关系速查图用一张流程图展示这 20 个函数的分类关系八、实战组合使用才是真正的威力itertools的真正魔力在于组合。单个函数只是积木拼在一起才能搭出漂亮的东西。场景处理分页 API 数据跳过前两页取接下来三页的所有结果from itertools import chain, islice # 假设 fetch_page(n) 返回第 n 页的数据列表 pages (fetch_page(n) for n in range(10)) # 跳过前2页取接下来3页展平成一个流 result list(chain.from_iterable(islice(pages, 2, 5)))场景给数据流打上行号但从 1001 开始from itertools import count data [apple, banana, cherry] numbered list(zip(count(1001), data)) # → [(1001, apple), (1002, banana), (1003, cherry)]场景找出列表中所有连续递增的片段from itertools import groupby from itertools import pairwise nums [1, 2, 3, 1, 2, 4, 5] # 用 pairwise 计算差值再用 groupby 找连续的 1 段 diffs [b - a for a, b in pairwise(nums)] # → [1, 1, -2, 1, 2, 1]九、使用时的几个注意事项学到这里有几个容易踩的坑值得单独说清楚迭代器只能走一遍itertools返回的都是迭代器遍历一次就耗尽了。如果需要多次遍历要么转成list()要么用tee()。groupby必须预排序这是最常见的 bug 来源。groupby只合并相邻的相同元素不会自动排序。无限迭代器要有出口count()、cycle()没有终点一定要配合截断函数使用。cycle()会复制数据cycle内部会把整个序列存一份处理超大序列时要注意内存。islice不支持负索引想取最后 N 个元素用collections.deque(it, maxlenN)更合适。结语itertools就像一套精心设计的乐高积木——每一块单独看都简单但组合起来能搭出令人惊叹的结构。从最常用的chain、islice、groupby到很多人从未用过的pairwise、batched、starmap这 20 个函数覆盖了数据处理中绝大多数需要循环但又不想写一堆循环的场景。真正掌握itertools的标志不是能背出每个函数的参数而是在写代码时脑子里自然而然地想到这里可以用accumulate或者这里用chain.from_iterable比列表推导式更优雅。那种感觉值得花时间练习。

相关新闻

Windows LAPS:企业本地管理员密码安全管理方案

Windows LAPS:企业本地管理员密码安全管理方案

1. Windows LAPS:企业级本地管理员密码管理方案解析在域环境管理中,最容易被忽视却最具破坏力的安全隐患往往来自本地管理员账户。想象一下:当攻击者获取了一台域内主机的本地管理员密码后,如果这个密码在整个企业内网通用&#x…

2026/10/14 21:52:38 阅读更多 →
企业级轻量级Web服务容器化落地全方案(Alpine + httpd)

企业级轻量级Web服务容器化落地全方案(Alpine + httpd)

文章目录 企业级轻量级Web服务容器化落地全方案(Alpine + httpd) 一、案例说明 1.1 案例背景 1.2 原方案核心痛点 1.3 优化目标 1.4 适用场景 二、详细实施步骤 2.1 阶段一:环境准备与基线梳理 2.2 阶段二:企业级标准化镜像构建 2.3 阶段三:网络与持久化资源规划 2.4 阶段…

2026/10/14 21:52:43 阅读更多 →
机器码修改技术原理与安全实践指南

机器码修改技术原理与安全实践指南

1. 机器码修改工具的核心原理与应用场景机器码作为硬件设备的唯一标识符,通常由网卡MAC地址、硬盘序列号、主板信息等硬件特征生成。在软件授权、设备管理、反作弊系统等领域,机器码被广泛用于设备识别和绑定。修改机器码的需求主要来源于以下几个场景&a…

2026/10/14 4:48:59 阅读更多 →

最新新闻

基于JSP的高校食堂食材选购管理系统毕业设计全攻略

基于JSP的高校食堂食材选购管理系统毕业设计全攻略

如果你拿到的题目是《基于JSP的高校食堂食材选购管理系统》,大概率正在为两件事发愁:一是“JSP”这个技术栈听起来太老,会不会在答辩时被老师嫌弃;二是“食堂食材选购”这个场景,到底该做成一个像电商一样的点单网站&a…

2026/10/15 4:50:55 阅读更多 →
atl90.dll丢失怎么办?官方运行库修复与安全下载避坑指南

atl90.dll丢失怎么办?官方运行库修复与安全下载避坑指南

双击一个老软件,桌面上突然弹出一个红色错误框:“无法启动此程序,因为计算机中丢失 atl90.dll。尝试重新安装该程序以解决此问题。”我敢说,凡是玩过 Windows 老游戏、用过 2008 到 2013 年间流行的办公软件或绘图工具的人&#x…

2026/10/15 4:50:55 阅读更多 →
CLion 2020.1.3 Win10配置指南:MinGW-w64工具链与CMake实战

CLion 2020.1.3 Win10配置指南:MinGW-w64工具链与CMake实战

1. 为什么2020.1.3这个版本值得单独拿出来说CLion 2020.1.3 这个版本在 C/C 开发圈子里其实是个挺特殊的存在。2020 年那会儿 JetBrains 刚把 CLion 的 CMake 工具链支持做了一次比较大的重构,2020.1 系列引入了对CMake Presets的早期支持、改进了远程开发模式下的工…

2026/10/15 4:50:55 阅读更多 →
编译器内建函数深度解析:原理、应用与性能优化实战

编译器内建函数深度解析:原理、应用与性能优化实战

不用盯着“某函数能不能用”这种表层问题,真正值得花时间搞明白的是:编译器内建函数到底是什么、它和普通库函数有什么本质区别、在实际项目里该怎么用才能既提性能又不踩坑。这篇文章不绕弯子,我直接按自己的使用经验把内建函数拆开讲透&…

2026/10/15 4:50:55 阅读更多 →
5G NR PDSCH时域资源调度:从参考点、K0到SLIV的完整解析

5G NR PDSCH时域资源调度:从参考点、K0到SLIV的完整解析

1. 从一条调度日志说起:PDSCH时域资源到底在调什么第一次接触5G NR物理层调度的人,多半会被一堆以字母开头的参数砸晕:K0、K1、SLIV、TDRA、Type A、Type B……单独看每个词都能查到定义,可一旦放进一条真实的DCI里,就…

2026/10/15 4:50:55 阅读更多 →
Python期末复习全量笔记:切片、默认参数与C3算法高频考点解析

Python期末复习全量笔记:切片、默认参数与C3算法高频考点解析

简介:南开大学软件学院Python期末复习资料是一份精准覆盖核心考点的完整笔记,面向软件学院本科生及Python进阶学习者,系统梳理了数据结构、对象与引用、内存管理、面向对象编程等期末考试重点。压缩包内含1个docx文档(5.28MB&…

2026/10/15 4:49:55 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 7:53:34 阅读更多 →