Python标准库itertools详解:高效迭代器工具全解析

林见深
林见深
发布时间:2026-10-12| 3人浏览过
原创

本文深入解析Python标准库itertools,涵盖accumulate、chain、combinations等17个核心函数。通过对比列表与迭代器的性能差异,展示如何利用延迟计算提升效率,并提供完整代码示例,帮助开发者写出更Pythonic的高效代码。

前言

近期工作节奏相对宽松,我决定撰写一系列技术文章与读者分享,同时也借此机会梳理自己这段时间碎片化获取的知识。正如所言,只有将知识理清才能准确表达,表达清晰才能思维透彻。

许多开发者致力于编写更具“Pythonic”风格的代码,这不仅符合规范且易于阅读,通常执行效率也更高。本文将重点介绍Python的标准库itertools。

itertools库概述

在Python中,迭代器(生成器)是一种常用且高效的数据结构。相较于列表(list),迭代器的最大优势在于延迟计算和按需使用,从而提升开发体验与运行效率。这也使得在Python 3中,map、filter等操作返回的不再是列表,而是迭代器对象。

尽管迭代器功能强大,但日常使用中大家接触最多的可能只有range函数。虽然可以通过iter()函数将列表转换为迭代器,但这往往显得多余。此时,本文的主角itertools库便派上了用场。

itertools库的使用

itertools中的函数大多返回各种迭代器对象。其中许多功能若用普通代码实现,不仅代码量大,运行效率也较低,而作为系统库的itertools则经过高度优化。

itertools.accumulate

该函数的主要功能是实现元素的累加操作。

>>> import itertools
>>> x = itertools.accumulate(range(10))
>>> print(list(x))
[0, 1, 3, 6, 10, 15, 21, 28, 36, 45]

itertools.chain

用于将多个列表或迭代器连接成一个单一的迭代器。

>>> x = itertools.chain(range(3), range(4), [3,2,1])
>>> print(list(x))
[0, 1, 2, 0, 1, 2, 3, 3, 2, 1]

itertools.combinations

用于从列表或生成器中选取指定数量的元素,生成所有不重复的组合。

>>> x = itertools.combinations(range(4), 3)
>>> print(list(x))
[(0, 1, 2), (0, 1, 3), (0, 2, 3), (1, 2, 3)]

itertools.combinations_with_replacement

用于生成允许元素重复的组合。

>>> x = itertools.combinations_with_replacement('ABC', 2)
>>> print(list(x))
[('A', 'A'), ('A', 'B'), ('A', 'C'), ('B', 'B'), ('B', 'C'), ('C', 'C')]

itertools.compress

根据提供的真值表(布尔序列)筛选并保留对应的元素。

>>> x = itertools.compress(range(5), (True, False, True, True, False))
>>> print(list(x))
[0, 2, 3]

itertools.count

这是一个计数器函数,允许用户指定起始位置和步长。

>>> x = itertools.count(start=20, step=-1)
>>> print(list(itertools.islice(x, 0, 10, 1)))
[20, 19, 18, 17, 16, 15, 14, 13, 12, 11]

itertools.cycle

用于无限循环遍历指定的列表或迭代器。

>>> x = itertools.cycle('ABC')
>>> print(list(itertools.islice(x, 0, 10, 1)))
['A', 'B', 'C', 'A', 'B', 'C', 'A', 'B', 'C', 'A']

itertools.dropwhile

根据给定的真值函数,丢弃迭代器前部满足条件的元素,直到遇到第一个不满足条件的元素为止。

>>> x = itertools.dropwhile(lambda e: e < 5, range(10))
>>> print(list(x))
[5, 6, 7, 8, 9]

itertools.filterfalse

与filter相反,该函数保留对应真值为False的元素。

>>> x = itertools.filterfalse(lambda e: e < 5, (1, 5, 3, 6, 9, 4))
>>> print(list(x))
[5, 6, 9]

itertools.groupby

根据分组函数的返回值对元素进行分组处理。

>>> x = itertools.groupby(range(10), lambda x: x < 5 or x > 8)             
>>> for condition, numbers in x:       
... print(condition, list(numbers))             
True [0, 1, 2, 3, 4]        
False [5, 6, 7, 8]        
True [9] 

itertools.islice

该函数允许对迭代器进行切片操作,类似于列表切片。

>>> x = itertools.islice(range(10), 0, 9, 2)
>>> print(list(x))
[0, 2, 4, 6, 8] 

itertools.permutations

用于生成指定数量元素的所有排列,注意排列中元素的顺序是有意义的。

>>> x = itertools.permutations(range(4), 3)
>>> print(list(x))
[(0, 1, 2), (0, 1, 3), (0, 2, 1), (0, 2, 3), (0, 3, 1), (0, 3, 2), (1, 0, 2), (1, 0, 3), (1, 2, 0), (1, 2, 3), (1, 3, 0), (1, 3, 2), (2, 0, 1), (2, 0, 3), (2, 1, 0), (2, 1, 3), (2, 3, 0), (2, 3, 1), (3, 0, 1), (3, 0, 2), (3, 1, 0), (3, 1, 2), (3, 2, 0), (3, 2, 1)] 

itertools.product

用于生成多个列表或迭代器的笛卡尔积。

>>> x = itertools.product('ABC', range(3))
>>>
>>> print(list(x))
[('A', 0), ('A', 1), ('A', 2), ('B', 0), ('B', 1), ('B', 2), ('C', 0), ('C', 1), ('C', 2)]

itertools.repeat

用于生成一个包含指定数量元素的简单迭代器,元素内容保持不变。

>>> x = itertools.repeat(0, 5)
>>> print(list(x))
[0, 0, 0, 0, 0] 

itertools.starmap

功能类似于map,但适用于参数已打包的情况。

>>> x = itertools.starmap(str.islower, 'aBCDefGhI')
>>> print(list(x))
[True, False, False, False, True, True, False, True, False]

itertools.takewhile

与dropwhile相反,该函数保留元素直到真值函数的值变为假(False)为止。

>>> x = itertools.takewhile(lambda e: e < 5, range(10))
>>> print(list(x))
[0, 1, 2, 3, 4]

itertools.tee

该函数用于从单个迭代器生成指定数量的独立迭代器,具体内部机制较为复杂。

>>> x = itertools.tee(range(10), 2)
>>> for letters in x:
... print(list(letters))
...
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 

itertools.zip_longest

类似于内置的zip函数,但其长度以较长的列表或迭代器为准,较短的会用None填充。

>>> x = itertools.zip_longest(range(3), range(5))
>>> y = zip(range(3), range(5))
>>> print(list(x))
[(0, 0), (1, 1), (2, 2), (None, 3), (None, 4)]
>>> print(list(y))
[(0, 0), (1, 1), (2, 2)] 

结语

以上内容大致总结了itertools库的主要功能。诚然,Python的各种语言特性和库必须通过大量实践才能熟练掌握,最终达到信手拈来的境界,这可谓是由术入道。

总结

以上就是本文的全部内容,希望这些内容能对各位的学习或工作有所帮助。如有任何疑问,欢迎留言交流,感谢大家对本站的支持。

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。