前情提示: 测试代码中,右尖括号(>
)表示命令行中输入的命令; 单独一行并以井字符(#
)开头的为输出内容; 库的导入仅在本文的第一个测试代码中展现,其他代码块均省略库的导入代码。
- 系统类型:
Windows 10
- python 版本:
Python 3.9.0
itertools
模块标准化了一个快速、高效利用内存的核心工具集,主要用来实现一系列迭代器。这些工具函数本身或工具函数之间的组合都是非常有用的。它们一起形成了 迭代器代数
。
itertools
模块中所有的函数都是创建并返回一个迭代器。它们的区别就是迭代器生成的内容,以及使用场景。
无穷迭代器
无穷迭代器最大的特点是可无限迭代元素,所以在使用时要注意一定要有限制条件来控制迭代器的停止,否则将造成死循环。
itertools.count(start=0, step=1)
start: int | float, 起始值
step: int | float, 步长
创建一个迭代器,第一个元素的值为参数 start
的值,之后元素的值按照参数 step
的值依次累加。
import itertools
'''打印一下迭代器本身'''
print(itertools.count(7, 1))
# count(7)
'''迭代器类型'''
print(type(itertools.count(7, 1)))
# <class 'itertools.count'>
'''一个简单的小应用'''
for i in itertools.count(7, 1):
print(i)
if i > 10:
break
# 7
# 8
# 9
# 10
# 11
itertools
模块中使用函数返回的迭代器的类型与函数同名,可直接在使用迭代器的场景使用。
itertools.cycle(iterable)
iterable: 可迭代对象
创建一个迭代器,以传入的迭代器中的元素为基础,返回这些元素,当这些元素被取完时,会重新从第一个元素获取,无限重复。
'''小应用, 当取到第三个 A 时停止'''
test_str = ''
for i in itertools.cycle('ABC'):
test_str += i
if test_str.count('A') >= 3:
break
print(test_str)
# ABCABCA
itertools.repeat(object[, times])
object: python 对象, 可以是任何数据
times: int, 迭代次数, 可选参数, 默认为无限次
创建一个迭代器,不断重复 object
。若设定了 times
,则最多重复 times
次,否则将重复无限次。通常用于 map()
函数中当作其中一个参数。
'''有限的迭代器'''
print(list(itertools.repeat(10, 3)))
# [10, 10, 10]
'''使用 map() 函数将两个迭代器元素之间的 pow() 结果收集起来'''
print(list(map(pow, range(10), itertools.repeat(2))))
# [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
以上这些无穷迭代器在测试时都是使用自身条件或外部限制来使它迭代有限的次数,这些函数生成的迭代器通常用于不确定要迭代次数的场景。
迭代器的操作与处理
itertools.accumulate(iterable[, func, *, initial=None])
iterable: 可迭代对象
func: 带有两个参数的函数, 可选参数
initial: 关键字参数, 默认为 None, 若此参数传参, 则此参数作为 iterable 的第一个元素
创建一个迭代器,默认情况下返回累计汇总值,若传入 func
,则按照 func
中的方法执行。例如: 若 iterable
为 [1, 2, 3]
,则返回的迭代器为 [1, 1+2, 1+2+3]
。
'''默认情况, 返回累计汇总值'''
print(list(itertools.accumulate([1, 2, 3, 4, 5])))
# [1, 3, 6, 10, 15]
'''方法修改为计算累计的乘积'''
print(list(itertools.accumulate([1, 2, 3, 4, 5], lambda x, y: x * y)))
# [1, 2, 6, 24, 120]
'''在迭代器起始位置添加一个元素, 方法不变, 返回累计汇总值'''
print(