我最近被要求做这项任务(学校):
编写一个 loop 生成器,该生成器将有限可迭代对象作为参数,并在无限循环中生成可迭代对象
所以我做到了:
import itertools
def loop(l):
for element in itertools.cycle(l):
yield element
和我的一位同学做了:
def loop(l):
while True:
for element in l:
yield element
我想知道两者之间的主要区别是什么,以及是否存在更“ pythonic”的方式来编写这样的简单内容。
答案 0 :(得分:3)
您是对的,itertools.cycle
在经典的while True
循环中并不是很有趣。
另一方面,它对无限的 generator comprehensions 很有帮助,在这里您无法创建无限循环,因为它仅允许for
,测试和函数调用。无限生成列表平方值的示例:
generator = (x*x for x in itertools.cycle(l))
当然,您总是可以通过以下方式缩短当前代码:
def loop(l):
yield from itertools.cycle(l)
甚至:
loop = itertools.cycle
答案 1 :(得分:3)
我想知道两者之间的主要区别是什么...
主要区别在于这些代码段的行为并不完全相同。使用Settings.navigationOptions = ({navigation}) => {
let headerRight = <Image ..... />
return {
headerRight,
};
}
,您可以接受并重复一个穷举的迭代器,而cycle
循环则不能。
while
对比度:
>>> def gen():
... yield 1
... yield 2
...
>>> def loop_it(it):
... for element in itertools.cycle(it):
... yield element
...
>>> g = loop_it(gen())
>>> next(g)
1
>>> next(g)
2
>>> next(g)
1
...,如果还有一种更“ pythonic”的方式来编写这样的简单内容
我的建议是>>> def loop_while(it):
... while True:
... for element in it:
... yield element
...
>>> g = loop_while(gen())
>>> next(g)
1
>>> next(g)
2
>>> next(g)
# ... hangs forever
循环,与写的完全一样。如果在一项学校任务中要求您 write 生成器,则可能会拒绝使用itertools中的“一个较早准备的”生成器。 while
循环也更像Python。相反,“ itertoolsthonic”方法将直接使用循环,如下所示:
while
没有必要为生成器函数编写额外的脚手架,也没有必要使用items = itertools.cycle(l)
# do something with `items`
来产生循环-由于循环已经是迭代器,因此您可以直接使用它。
答案 2 :(得分:1)
正如我所见,itertools.cycle
的目的是您根本不必自己编写它:)
最蟒蛇的方法是简单地编写loop = itertools.cycle
。
如果您确实需要将其编写为学校作业的生成器,则第二种形式可能会执行得更快,因为第一种形式基本上可以完成同样的任务,但是从{{1} }。