itertools.repeat(n)和itertools.cycle(n)有什么区别吗?正如看上去的那样,它们产生的产量是一样的。在需要无限循环元素的情况下,是否可以更有效地使用?
发布于 2016-04-19 06:19:19
简单地说,itertools.repeat将重复给定的参数,而itertools.cycle将遍历给定的参数。不要运行此代码,但例如:
from itertools import repeat, cycle
for i in repeat('abcd'): print(i)
# abcd, abcd, abcd, abcd, ...
for i in cycle('abcd'): print(i)
# a, b, c, d, a, b, c, d, ...发布于 2016-04-19 06:26:32
它们是等价的,但第一种更清晰,速度更快:
it = repeat(x)
it = cycle([x])然而,循环可以选择重复整个序列:
it = cycle(['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday'])重复可以选择对重复次数设置一个限制:
it = repeat(x, 5) # Return five repetitions of x而且,预期用例是不同的。
特别是,repeat被设计为为映射函数提供一个重复的参数:
it = imap(pow, repeat(2), range(10))循环用于循环循环行为。下面是返回1/1 - 1/3 + 1/5 - 1/7 + 1/9 + ...的Python3示例
it = accumulate(map(operator.truediv, cycle([1, -1]), count(1, 2)))后一个例子显示了所有部分是如何组合在一起创建一个“迭代器代数”的。
希望你发现这很有启发性:)
发布于 2016-04-19 06:26:40
itertools.cycle()需要一个迭代器。您不能这样做,例如,itertools.cycle(5) -这将引发一个错误:
>>> itertools.cycle(3)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'int' object is not iterableitertools.repeat()会一次又一次地重复相同的元素--它不是为了迭代迭代器的元素而设计的。它非常适合一次又一次地返回相同的对象。
换句话说,执行itertools.repeat([1,2,3], 5)可以:
>>>>[i for i in itertools.repeat([1,2,3], 5)]
[[1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3]]在执行itertools.cycle([1,2,3])时,会返回一个类似于[1,2,3,1,2,3,1,2,3,...]的无限列表(或者说,如果您可以将它放入内存中,它至少会这样做)。
差别是相当深远的。
https://stackoverflow.com/questions/36709978
复制相似问题