我想迭代一些无限的生成器:
def x(y):
while True:
for i in xrange(y):
yield i
for i,j in zip(x(5),x(3)):
print i,j
上面的代码将不会产生任何结果。我做错了什么?
答案 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)