首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >itertools.repeat对itertools.cycle

itertools.repeat对itertools.cycle
EN

Stack Overflow用户
提问于 2016-04-19 06:13:48
回答 5查看 3.4K关注 0票数 4

itertools.repeat(n)itertools.cycle(n)有什么区别吗?正如看上去的那样,它们产生的产量是一样的。在需要无限循环元素的情况下,是否可以更有效地使用?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2016-04-19 06:19:19

简单地说,itertools.repeat将重复给定的参数,而itertools.cycle将遍历给定的参数。不要运行此代码,但例如:

代码语言:javascript
复制
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, ...
票数 9
EN

Stack Overflow用户

发布于 2016-04-19 06:26:32

它们是等价的,但第一种更清晰,速度更快:

代码语言:javascript
复制
it = repeat(x)
it = cycle([x])

然而,循环可以选择重复整个序列:

代码语言:javascript
复制
it = cycle(['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday'])

重复可以选择对重复次数设置一个限制:

代码语言:javascript
复制
it = repeat(x, 5)         # Return five repetitions of x

而且,预期用例是不同的。

特别是,repeat被设计为为映射函数提供一个重复的参数:

代码语言:javascript
复制
it = imap(pow, repeat(2), range(10))

循环用于循环循环行为。下面是返回1/1 - 1/3 + 1/5 - 1/7 + 1/9 + ...的Python3示例

代码语言:javascript
复制
it = accumulate(map(operator.truediv, cycle([1, -1]), count(1, 2)))

后一个例子显示了所有部分是如何组合在一起创建一个“迭代器代数”的。

希望你发现这很有启发性:)

票数 6
EN

Stack Overflow用户

发布于 2016-04-19 06:26:40

itertools.cycle()需要一个迭代器。您不能这样做,例如,itertools.cycle(5) -这将引发一个错误:

代码语言:javascript
复制
>>> 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)可以:

代码语言:javascript
复制
>>>>[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,...]的无限列表(或者说,如果您可以将它放入内存中,它至少会这样做)。

差别是相当深远的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36709978

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档