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模块中定义的各种迭代器工具。