itertools
了解 itertools 库提供的用于迭代的函数。
我们已经在本课程的其他部分提到了一些库。本章将告诉你如何找到这些库,并列出可以进一步探索的领域。
itertools
itertools 是 Python 的标准库之一——它是 Python 自带的,无需额外安装。
它包含一系列用于迭代的实用函数。以下是一些亮点;更多详细信息请参考 python.org 上的官方文档。
无限迭代器
这些是会无限持续下去的迭代器。
count
count(start, [step]) 生成一个从指定起始值开始的无限递增序列。
例如:
1count(0) # 生成 0, 1, 2 ...
它的行为类似于 range,但结束值被设为无穷大。还可以选择性地指定步长:
1count(5, 2) # 生成 5, 7, 9 ...
repeat
repeat(x, [n]) 生成一个无限重复值 x 的序列。可选参数 n 用于限制循环次数,在执行 n 次后停止。
cycle
cycle(it) 通过不断重复可迭代对象 it 中的元素来创建一个无限序列。
例如:
1cycle([1, 2, 3]) # 生成 1, 2, 3, 1, 2, 3, 1, 2, 3...
你可以在下面的代码编辑器中尝试这些迭代器。
1import itertools 2 3for i in itertools.count(0): 4 if i == 4: 5 break 6 else: 7 print(i, end =" ") 8 9print() 10 11for i in itertools.count(5, 2): 12 if i == 11: 13 break 14 else: 15 print(i, end =" ") 16 17print() 18 19print (list(itertools.repeat(2, 4))) 20 21count = 0 22for i in itertools.cycle('Hello'): 23 if count > 5: 24 break 25 else: 26 print(i, end = " ") 27 count += 1
其他迭代器
itertools 还包含一组其他有用的迭代器。其中一些是对内置函数的有用变体。
zip_longest
zip_longest(p, q ..., fillvalue = None) 用于合并多个可迭代对象。其工作方式与普通 zip 函数非常相似。区别在于:zip 在最短的可迭代对象耗尽时停止,而 zip_longest 会一直运行到最长的可迭代对象结束。缺失的值会被填充为 fillvalue,默认为 None。
1from itertools import zip_longest 2 3a = [1, 2, 3] 4b = [10, 20] 5print(list(zip(a, b))) # 生成 (1, 10), (2, 20) 6print(list(zip_longest(a, b))) # 生成 (1, 10), (2, 20), (3, None)
starmap
starmap(fn, it) 与 map 非常相似。不同之处在于:如果 fn 接受多个参数,map 要求传入多个可迭代对象(每个参数对应一个),而 starmap 只需要一个包含元组的可迭代对象,每个元组包含 n 个值。当数据本身已经是元组形式时,这非常方便——无需再用 zip 重新格式化数据,可以直接使用 starmap。
如果你的数据是以多个可迭代对象的形式提供的,应使用 map,如下面代码第 4 行所示。但如果你的数据已经是一个包含元组的单一可迭代对象,则应使用 starmap,如第 5 行所示。
1from itertools import starmap 2from operator import add 3 4print(list( map(add, [1, 2, 3], [4, 5, 6]) )) 5print(list( starmap(add, [(1, 4), (2, 5), (3, 6)]) ))
filterfalse
filterfalse(fn, it) 与 filter 完全相同,只是判断逻辑相反。filter 保留 fn 为真时的元素,丢弃为假的元素;而 filterfalse 保留 fn 为假的元素,丢弃为真的元素。
其他函数
还有一些值得了解的附加函数:
accumulate类似于sum,但会保留数值的累计总和。chain将两个或多个可迭代对象连接成一个单一的迭代器。tee从一个可迭代对象中返回n个独立的迭代器。takewhile类似于filter,它从可迭代对象中返回所有元素,直到函数结果为假为止。与filter不同的是,takewhile在遇到第一个假值后立即停止。dropwhile与takewhile相反。它会跳过所有使函数为真的元素,直到函数首次为假,之后才开始返回所有后续元素。
组合
itertools 还提供了一些函数,用于生成可迭代对象中所有元素的排列和组合。