itertools.cycle(iterable)与True时

时间:2018-09-06 19:57:53

标签: python python-3.x loops itertools

我最近被要求做这项任务(学校):

  

编写一个 loop 生成器,该生成器将有限可迭代对象作为参数,并在无限循环中生成可迭代对象

所以我做到了:

import itertools
def loop(l):
    for eleme‍‌​‍‌nt in itertools.cycle(l):
        yield element

和我的一位同学做了:

def loop(l):
    while True:
​‍         for element in l:
            yield element

我想知道两者之间的主要区别是什么,以及是否存在更“ pythonic”的方式来编写这样的简单内容。

3 个答案:

答案 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} }。