Python函数创建用于高效循环的迭代器

与大多数编程语言一样,Python提供while和for语句来形成循环结构。for语句对于遍历列表,元组或字符串之类的可迭代对象特别有用。在Python标准库的itertools模块中定义了更高效,更快速的迭代工具。这些迭代器构建块是功能性编程语言(例如Haskell和SML)中类似工具的Pythonic实现。

itertools模块中的函数分为三种类型。

  • 无限迭代器

  • 有限迭代器

  • 组合迭代器

以下函数生成无限序列。

count() -此函数返回从起始值开始均匀间隔的值的迭代器。该功能可以具有可选的步长值,以该间隔增加连续值。

>>> from itertools import count
>>> for x in count(20):
print (x)
>>> for x in count(100,10):
print (x)

第一条语句将生成从20开始的无限序列,第二条语句将从100生成具有步进频率10的数字。请注意,循环是无限的,不会自行终止。它们将在按ctrl-C时终止

cycle() -此函数开始从给定的iterable返回每个元素,并保存其副本。元素用完后,将返回已保存副本中的元素,从而形成无限循环。

>>> from itertools import cycle
>>> for x in cycle("hello"):
print (x)

字符串中的字符将重复打印,直到发出键盘中断Ctrl-C。

repeat() -此函数重复返回对象参数。如果提供第二个参数“时间”,则重复发生多次。

>>> from itertools import repeat
>>> for x in repeat(1):
print (x)
>>> for x in repeat('hello', 10):
print (x)

第一循环将无休止地打印1。第二个打印“ hello” 10次。

以下类别中的函数返回以最短输入序列终止的有限迭代器。

accumulate() -此函数有两个参数。首先是一个可迭代的(列表,元组或字符串)。默认情况下,第二个参数是operator.add()(运算符模块中实现标准加法运算符的函数),但也可以是接收两个数字参数的任何其他函数。

accumulate(sequence, func)

输入序列的前两个元素由func处理。处理的结果是下一个迭代的第一个参数,func的第二个参数是输入序列中的第三个元素。重复此过程,直到顺序用尽。累积函数返回一个迭代器,其中每个元素都是对连续元素进行处理的结果。

在以下示例中,列表中的数字被累加。请注意,默认功能参数为添加操作。

>>> from itertools import accumulate
>>> list(accumulate([1,2,3,4,5]))
[1, 3, 6, 10, 15]

我们可以将用户定义的函数作为第二个参数来accumulate()起作用

>>> def multiply(x,y):
return x*y
>>> list(accumulate([1,2,3,4,5], multiply))
[1, 2, 6, 24, 120]

此行为有点类似于内置reduce()方法。该reduce()函数仅返回累加的最终结果,而accumulate()构建所有中间结果的迭代器。

chain() -此函数可以有多个可迭代项作为参数。它将每个第一个可迭代的元素生成到结果迭代器中,然后进行下一个迭代,直到用完可迭代的参数为止。

>>> from itertools import chain
>>> list(chain([10,20],'hello',range(4)))
[10, 20, 'h', 'e', 'l', 'l', 'o', 0, 1, 2, 3]

dropwhile() -只要谓词函数参数返回true,此函数就通过从terable中删除元素来返回迭代器。函数返回false时,所有剩余元素都将交还给迭代器。

>>> from itertools import dropwhile
>>> def iseven(x):
if x % 2 == 0:
return True
else:
return False
>>> list(dropwhile(iseven, [12,90,61,4,15]))
[61, 4, 15]

filterfalse() -该函数通过过滤出谓词结果为False的元素来返回迭代器。

>>> from itertools import filterfalse
>>> def iseven(x):
if x % 2 == 0:
return True
else:
return False
>>> list(filterfalse(iseven, [12,90,61,4,15]))
[61, 15]

islice() -此函数通过从iterable中选择某些元素来构建迭代器。选择标准取决于启动,停止和步骤参数。选择从起始值开始,一直持续到终止值。如果stop为None,它将上升到可迭代结束,否则选择将在指定的索引处停止。默认情况下,step参数为1。元素的选择按步长参数递增。所有参数都不能为负。

>>> from itertools import islice
>>> list(islice(range(10),1,5,2))
[1, 3]
>>> list(islice(range(10),0,None,3))
[0, 3, 6, 9]
>>> list(islice(range(10),5,None))
[5, 6, 7, 8, 9]
>>> list(islice(range(10),5))
[0, 1, 2, 3, 4]

以下函数从可迭代对象生成组合迭代器。

product() -此函数生成一个迭代器,该迭代器是输入序列中元素的笛卡尔积。这等效于构造嵌套的for循环,用于遍历每个可迭代序列。

在下面的示例中,列表理解技术用于对两个序列运行两个嵌套循环以构建笛卡尔积。

>>> [[x,y] for x in [1,2,3] for y in ['a','b','c']]
[[1, 'a'], [1, 'b'], [1, 'c'], [2, 'a'], [2, 'b'], [2, 'c'], [3, 'a'], [3, 'b'], [3, 'c']]

product()函数产生类似的结果

>>> from itertools import product
>>> list(product([1,2,3],['a','b','c']))
[(1, 'a'), (1, 'b'), (1, 'c'), (2, 'a'), (2, 'b'), (2, 'c'), (3, 'a'), (3, 'b'), (3, 'c')]

permutations() -此函数产生输入可迭代元素中所有可能的排列。可以将每个排列的长度指定为该函数的第二个参数。如果未指定,则长度为1。

>>> list(permutations(range(1,4),2))
[(1, 2), (1, 3), (2, 1), (2, 3), (3, 1), (3, 2)]

groups() -此函数产生可迭代输入中元素的所有可能组合。可以将每个排列的长度指定为该函数的第二个参数。如果未指定,则长度为1。

>>> from itertools import combinations
>>> list(combinations(range(1,4),2))
[(1, 2), (1, 3), (2, 3)]

本文介绍了Python库的itertools模块中定义的各种迭代器工具。