itertools.repeat VS itertools.cycle
itertools.repeat VS itertools.cycle
itertools.repeat(n)
和itertools.cycle(n)
有区别吗?看起来,它们产生相同的输出。在我需要某个元素的 无限 循环的情况下,使用一种更有效吗?
简单地说,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, ...
这些是等价的,但第一个更清晰,速度更快:
it = repeat(x)
it = cycle([x])
但是,循环可以选择重复整个序列:
it = cycle(['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday'])
而repeat有设置重复次数限制的选项:
it = repeat(x, 5) # Return five repetitions of x
此外,预期用例也不同。
特别是,repeat 旨在为映射函数提供重复参数:
it = imap(pow, repeat(2), range(10))
虽然 cycle 用于循环重复行为。这是一个 Python 3 的例子 returns 1/1 - 1/3 + 1/5 - 1/7 + 1/9 + ...
:
it = accumulate(map(operator.truediv, cycle([1, -1]), count(1, 2)))
后一个示例显示了所有部分如何组合在一起以创建 "iterator algebra"。
希望您觉得这对您有所启发:-)
itertools.cycle()
采用 迭代器 。例如,您不能这样做 itertools.cycle(5)
- 这会引发错误:
>>> itertools.cycle(3)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'int' object is not iterable
itertools.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])
returns 一个看起来像 [1,2,3,1,2,3,1,2,3,...]
的无限列表(或者至少如果你能以某种方式将它放入内存的话)。
差异相当大。
itertools.repeat
returns 同一个对象一遍又一遍,itertools.cycle
迭代一遍又一遍地在同一个物体上。所以:
import itertools
# Warning: infinite loop ahead
for x in itertools.repeat([1, 2, 3]):
print(x)
# [1, 2, 3], [1, 2, 3], ...
for x in itertools.cycle([1, 2, 3]):
print(x)
# 1, 2, 3, 1, 2, 3, ...
因此,如果您想要的是 returns 一个对象多次,请使用 itertools.repeat
;如果它是循环遍历某些不同对象的东西,请使用 itertools.cycle
.
参考itertools文档了解区别。
>>> import itertools
>>> help(itertools.repeat)
Help on class repeat in module itertools:
class repeat(__builtin__.object)
| repeat(object [,times]) -> create an iterator which returns the object
| for the specified number of times. If not specified, returns the object
| endlessly.
|
...
...
>>> help(itertools.cycle)
Help on class cycle in module itertools:
class cycle(__builtin__.object)
| cycle(iterable) --> cycle object
|
| Return elements from the iterable until it is exhausted.
| Then repeat the sequence indefinitely.
|
itertools.repeat(n)
和itertools.cycle(n)
有区别吗?看起来,它们产生相同的输出。在我需要某个元素的 无限 循环的情况下,使用一种更有效吗?
简单地说,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, ...
这些是等价的,但第一个更清晰,速度更快:
it = repeat(x)
it = cycle([x])
但是,循环可以选择重复整个序列:
it = cycle(['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday'])
而repeat有设置重复次数限制的选项:
it = repeat(x, 5) # Return five repetitions of x
此外,预期用例也不同。
特别是,repeat 旨在为映射函数提供重复参数:
it = imap(pow, repeat(2), range(10))
虽然 cycle 用于循环重复行为。这是一个 Python 3 的例子 returns 1/1 - 1/3 + 1/5 - 1/7 + 1/9 + ...
:
it = accumulate(map(operator.truediv, cycle([1, -1]), count(1, 2)))
后一个示例显示了所有部分如何组合在一起以创建 "iterator algebra"。
希望您觉得这对您有所启发:-)
itertools.cycle()
采用 迭代器 。例如,您不能这样做 itertools.cycle(5)
- 这会引发错误:
>>> itertools.cycle(3)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'int' object is not iterable
itertools.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])
returns 一个看起来像 [1,2,3,1,2,3,1,2,3,...]
的无限列表(或者至少如果你能以某种方式将它放入内存的话)。
差异相当大。
itertools.repeat
returns 同一个对象一遍又一遍,itertools.cycle
迭代一遍又一遍地在同一个物体上。所以:
import itertools
# Warning: infinite loop ahead
for x in itertools.repeat([1, 2, 3]):
print(x)
# [1, 2, 3], [1, 2, 3], ...
for x in itertools.cycle([1, 2, 3]):
print(x)
# 1, 2, 3, 1, 2, 3, ...
因此,如果您想要的是 returns 一个对象多次,请使用 itertools.repeat
;如果它是循环遍历某些不同对象的东西,请使用 itertools.cycle
.
参考itertools文档了解区别。
>>> import itertools
>>> help(itertools.repeat)
Help on class repeat in module itertools:
class repeat(__builtin__.object)
| repeat(object [,times]) -> create an iterator which returns the object
| for the specified number of times. If not specified, returns the object
| endlessly.
|
...
...
>>> help(itertools.cycle)
Help on class cycle in module itertools:
class cycle(__builtin__.object)
| cycle(iterable) --> cycle object
|
| Return elements from the iterable until it is exhausted.
| Then repeat the sequence indefinitely.
|