深入理解 `itertools`:分类解析常用函数 (Effective Python 第36条) - 教程

news/2025/10/15 13:28:33/文章来源:https://www.cnblogs.com/lxjshuju/p/19143120

深入理解 `itertools`:分类解析常用函数

  • 一、迭代器的基本操作
    • 1.`itertools.chain`
    • 2.`itertools.islice`
    • 3. `itertools.tee`
  • 二、组合与笛卡尔积
    • 4. `itertools.product`
    • 5. `itertools.permutations`
    • 6. `itertools.combinations`
  • 三、函数应用与映射
    • 7. `itertools.starmap`
  • 四、无限序列生成
    • 8. `itertools.count`
    • 9. `itertools.cycle`
    • 10. `itertools.repeat`
  • 五、分组与统计
    • 11. `itertools.groupby`
  • 六、其他工具
    • 12. `itertools.zip_longest`
  • 总结

在 Python 开发中,处理迭代器和生成器是常见且重要的任务。itertools 模块提供了丰富的工具,帮助我们高效地操作这些迭代器。然而,面对模块中众多的函数,如何系统地理解和使用它们呢?本文将对 itertools 中的常用函数进行分类解析,帮助你更好地掌握这些工具。


一、迭代器的基本操作

1.itertools.chain

chain 将多个迭代器或可迭代对象拼接成一个单一的迭代器,非常适合处理分散的数据源。

import itertools
iter1 = iter([1, 2, 3])
iter2 = iter([4, 5, 6])
combined = itertools.chain(iter1, iter2)
for x in combined:
print(x)  # 输出: 1, 2, 3, 4, 5, 6

2.itertools.islice

islice 从迭代器中截取指定范围的元素,支持惰性求值,适合处理大数据。

import itertools
data = iter([1, 2, 3, 4, 5, 6])
sliced = itertools.islice(data, 2, 5)
for x in sliced:
print(x)  # 输出: 3, 4, 5

3. itertools.tee

tee 将一个迭代器分成多个独立的迭代器,允许同时遍历同一个数据源。

import itertools
data = iter([1, 2, 3, 4, 5])
iter1, iter2 = itertools.tee(data, 2)
for x in iter1:
print(x)  # 输出: 1, 2, 3, 4, 5
for x in iter2:
print(x)  # 输出: 1, 2, 3, 4, 5

二、组合与笛卡尔积

4. itertools.product

product 计算多个迭代器的笛卡尔积,适用于需要生成所有可能组合的场景。

import itertools
a = [1, 2]
b = ['a', 'b']
product = itertools.product(a, b)
for x in product:
print(x)  # 输出: (1, 'a'), (1, 'b'), (2, 'a'), (2, 'b')

5. itertools.permutations

permutations 生成给定长度的排列,适用于需要考虑顺序的组合问题。

import itertools
data = [1, 2, 3]
perms = itertools.permutations(data, 2)
for x in perms:
print(x)  # 输出: (1,2), (1,3), (2,1), (2,3), (3,1), (3,2)

6. itertools.combinations

combinations 生成给定长度的组合,适用于不需要考虑顺序的场景。

import itertools
data = [1, 2, 3]
combs = itertools.combinations(data, 2)
for x in combs:
print(x)  # 输出: (1,2), (1,3), (2,3)

三、函数应用与映射

7. itertools.starmap

starmap 将迭代器中的每个元素解包后作为函数的参数调用,适合需要灵活调用函数的场景。

import itertools
data = [(1, 2), (3, 4), (5, 6)]
import operator
results = itertools.starmap(operator.add, data)
for x in results:
print(x)  # 输出: 3, 7, 11

四、无限序列生成

8. itertools.count

count 生成无限递增的整数序列,适用于需要无限计数的场景。

import itertools
counter = itertools.count(start=1, step=2)
for x in itertools.islice(counter, 5):
print(x)  # 输出: 1, 3, 5, 7, 9

9. itertools.cycle

cycle 无限循环地生成给定迭代器中的元素,适用于需要循环处理数据的场景。

import itertools
data = ['a', 'b', 'c']
cycle = itertools.cycle(data)
for x in itertools.islice(cycle, 6):
print(x)  # 输出: a, b, c, a, b, c

10. itertools.repeat

repeat 无限重复生成给定的值,适用于需要重复处理同一数据的场景。

import itertools
repeater = itertools.repeat('hello', times=3)
for x in repeater:
print(x)  # 输出: hello, hello, hello

五、分组与统计

11. itertools.groupby

groupby 根据键函数对迭代器中的元素进行分组,适用于需要按条件分组处理的场景。

import itertools
data = [1, 2, 3, 4, 5, 6]
grouped = itertools.groupby(data, key=lambda x: x % 2 == 0)
for key, group in grouped:
print(f"Key: {key}, Group: {list(group)}")
# 输出:
# Key: False, Group: [1, 3, 5]
# Key: True, Group: [2, 4, 6]

六、其他工具

12. itertools.zip_longest

zip_longest 将多个迭代器按长对齐的方式合并,不足的部分填充 fillvalue(默认为 None)。

import itertools
iter1 = iter([1, 2, 3])
iter2 = iter([4, 5])
zipped = itertools.zip_longest(iter1, iter2, fillvalue=0)
for x in zipped:
print(x)  # 输出: (1,4), (2,5), (3,0)

总结

itertools 模块是 Python 中处理迭代器和生成器的利器,提供了丰富的工具来满足各种需求。通过合理分类和理解这些函数,我们可以更高效地编写代码,提升程序的性能和可读性。希望本文能帮助你更好地掌握 itertools,在实际开发中游刃有余!


参考资料

  1. Python 官方文档 - itertools
  2. Effective Python 第 36 条

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/937459.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux配置环境变量

1、首先打开.bashrc文件 2、添加信息到文件末尾:export JAVA_HOME="/www/server/java/jdk1.8.0_371" export MVN="/root/app/apache-maven-3.9.11" export PATH=$JAVA_HOME/bin:$MVN/bin:$PATH3、…

assert的基本用法

一、assert 是什么 assert 是 Python 提供的一种 调试语句,用于在程序运行时做“自检”, 验证一个表达式是否为真(True)。 它的作用就像一个 自动检测点(checkpoint): 如果条件为 True → 程序继续执行 如果条件…

1688代发铺货规格匹配设置

自动匹配有问题时,可以手动匹配,位置在"分销"->"已铺货商品"页面,商品行"更多"中"匹配规格"操作

2025年整平机厂家最新推荐排行榜,精密整平机,数控整平机,自动整平机,板材整平机源头厂家专业选购指南

2025年整平机厂家最新推荐排行榜:精密整平机、数控整平机、自动整平机、板材整平机源头厂家专业选购指南行业背景与发展趋势随着制造业向智能化、精密化方向快速发展,整平机作为金属板材加工领域的关键设备,其技术水…

task2

任务1#include <stdio.h> #include <stdlib.h>#include <time.h> #define N 5 #define N1 80 #define N2 35 int main(){int cnt;int random_major,random_no;srand(time(NULL));cnt=0;while(cnt &l…

KiloCode 与 Claude Code 在长上下文文件写入操作中的稳定性差异深度解析

KiloCode 与 Claude Code 在长上下文文件写入操作中的稳定性差异深度解析 在人工智能辅助编程领域,工具的稳定性和可靠性对于开发者而言至关重要。随着项目规模和复杂性的增加,开发者越来越依赖这些工具来处理繁琐的…

2025年机械加工厂家最新权威推荐榜:钣金/焊接/零件/非标自动化/精密金属加工,专业定制与技术创新实力解析

2025年机械加工厂家最新权威推荐榜:钣金/焊接/零件/非标自动化/精密金属加工,专业定制与技术创新实力解析随着制造业向智能化、精密化方向加速转型,机械加工行业正经历着深刻的技术变革。在工业4.0和智能制造的推动…

2025年10月15号随笔

2025年10月15号随笔今年是一个崭新的一年也是极具挑战的一年,做了几年的电动车业务也全面转型了,虽然转型路上不是那么平坦。但是也是到了不得不的程度,希望是一个很好的开始,并且我坚信我可以再别的类目茁壮成长发…

Ubuntu20.04安装NVIDIA显卡驱动、CUDA Toolkit、cuDNN步骤(二) - 指南

Ubuntu20.04安装NVIDIA显卡驱动、CUDA Toolkit、cuDNN步骤(二) - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: …

java基础7-ArrayList

1.集合的基本使用: (1)集合和数组的对比:长度:数组长度固定,集合长度可变 存储类型:数组可以存储基本数据类型也可以存引用数据类型,但集合只能存储引用数据类型,如果需要存储基本数据类型需要把它们变成对应的…

两个用于从B站下载视频的Shell脚本

我在下载四郎讲棋的、最多收藏的、时长低于10分钟的 用于人工收集URL的:prev= while clipnotify; do t=`xclip -o` if ! [[ "$t" =~ ^http ]]; then continue; fi if [[ "$t" == $prev ]]; then …

2025年冲压件厂家最新权威推荐榜:新能源/光伏/精密/异形/五金/铝/汽配/不锈钢/家具冲压件源头厂商深度解析

2025年冲压件厂家最新权威推荐榜:新能源/光伏/精密/异形/五金/铝/汽配/不锈钢/家具冲压件源头厂商深度解析行业背景与发展趋势冲压件作为现代制造业的基础零部件,其技术水平和产品质量直接影响着终端产品的性能与可靠…

P3800 Power 收集和单调队列优化dp小总结

前言 历尽千辛万苦,终于在自己和老师的帮助下把P3800 Power 收集给过了,有一些trick要讲 P3800 Power 题目背景 据说在红雾异变时,博丽灵梦单身前往红魔馆,用十分强硬的手段将事件解决了。 然而当时灵梦在 Power 达…

微信群机器人接口

微信群机器人接口、个微协议/微信号二次开发/ipad协议、个人微信号二次开发api协议、用API开发个人微信聊天机器人 可实现微信绝大部分的功能;微信收藏、微信标签等! 消息群发、通过好友请求、微信建群、微信拉人进群…

2025 年杭州品牌策划公司机构推荐榜:餐饮品牌策划/家电品牌策划聚焦实战力与适配性,这家杭州本土机构值得关注

随着 “AI+” 国家战略的深入推进及数字经济的加速发展,品牌策划已从企业 “可选服务” 升级为 “核心竞争力刚需”。2025 年,无论是新消费品牌的孵化、传统企业的数字化转型,还是细分赛道的差异化突围,企业对专业…

2025 年土工格栅厂家推荐榜:聚焦工程适配与品质保障,优选山东大成工程材料有限公司

随着国内基建行业向高质量发展转型,交通、水利、生态修复等领域对土体加固、边坡防护材料的性能要求持续升级,土工格栅作为核心土工合成材料,市场需求在 2025 年预计实现稳步增长。但市场扩张也带来产品质量参差不齐…

2025年液压阀块厂家最新权威推荐榜:液压阀/阀块加工/阀块零件机加工专业制造商,技术实力与市场口碑深度解析

2025年液压阀块厂家最新权威推荐榜:液压阀/阀块加工/阀块零件机加工专业制造商,技术实力与市场口碑深度解析液压传动技术作为现代工业装备的核心动力传输方式,其关键元件液压阀块的性能直接影响整个系统的运行效率与…

logging模块用法

一、logging 模块的作用 logging 的核心功能是: 在程序运行过程中,输出并记录各种级别的日志(调试信息、警告、错误、关键事件等)。 相比 print(),它的优势:特点print()logging输出级别控制❌ 无✅ 支持 DEBUG/I…

软件服务行业,被玩坏了的阿米巴

阿米巴” 本是生物学概念,指可向任意方向伸出伪足、形体随环境变化的变形虫,其核心特性是随外界的变化进行自我调整以适配生存需求。这一 “适应性” 本质,也成为管理学借鉴的核心逻辑。在管理学领域,“阿米巴” 是…

详细介绍:MQTT数据集成

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …