Python如何同时迭代两个无限生成器?

时间:2017-03-28 12:02:25

标签: python python-2.x

我想迭代一些无限的生成器:

def x(y):
    while True:
        for i in xrange(y):
            yield i

for i,j in zip(x(5),x(3)):
    print i,j

上面的代码将不会产生任何结果。我做错了什么?

4 个答案:

答案 0 :(得分:2)

这是因为Python 2 zip尝试通过获取生成器将生成的所有元素来创建列表。你想要的是一个迭代器,即itertools.izip

在Python 3中,zip的工作方式与izip类似。

答案 1 :(得分:1)

zip不适合生成器。请改为itertools.izip

(或者甚至更好,使用Python 3,您的代码可以正常工作 - 一旦您将括号添加到print

答案 2 :(得分:1)

您只需要使用zip的变体来返回迭代器而不是列表。幸运的是,itertools模块中有一个。

import itertools

def x(y):
    while True:
        for i in xrange(y):
            yield i

for i,j in itertools.izip(x(5),x(3)):
    print i,j

请注意,在Python 3中,itertools.izip不存在,因为vanilla zip已经是迭代器。

同样在itertools中,有一个名为cycle的函数,它在无限循环上无限循环。

  

使迭代器从iterable返回元素并保存a   每个的副本。当iterable耗尽时,返回from中的元素   保存副本。无限期地重复。

所以itertools.cycle(range(5))x(5)做同样的事情;您也可以将xrange(5)传递给cycle,但这并不挑剔。 ;)

答案 3 :(得分:0)

据我所知,你试图同时迭代两个迭代器。如果没有别的办法,你总是可以使用while循环。

gen1 = x(5)
gen2 = x(3)

while True:
    try:
        print(next(gen1), next(gen2))
    except StopIteration:
        break

如果你使用python3.4及更高版本,那么你的函数x也可以重构 -

def x(y):
     yield from xrange(y)