繁体   English   中英

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

[英]Python how to iterate two infinite generators at the same time?

我想遍历许多无限生成器:

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

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

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

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

在Python 3中, zip工作方式类似于izip

zip不是生成器的正确工具。 请尝试itertools.izip

(或更妙的是,使用Python 3,您的代码可以正常工作-将括号添加到print

您只需要使用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不存在,因为普通zip已经是一个迭代器。


同样在itertools有一个叫做cycle的函数,它在一个可迭代对象上无限循环。

创建一个迭代器,从迭代器返回元素,并保存每个元素的副本。 当Iterable耗尽时,从保存的副本中返回元素。 无限重复。

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

据我了解,您正在尝试同时迭代两个迭代器。 如果没有其他作用,则可以始终使用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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM