[英]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.