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

Python如何同时迭代两个无限生成器?;,python,python-2.x,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 上面的代码将不会产生任何结果。我做错了什么?zip不是生成器的正确工具。试试itertools.izip (或者更好的是,使用Python 3,在那里您的代码可以很好地工作-一旦您在打印中添加了括号)zip不是生成器的正确工具。试试ite

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

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

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

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

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


(或者更好的是,使用Python 3,在那里您的代码可以很好地工作-一旦您在
打印
中添加了括号)

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


(或者更好的是,使用Python 3,在那里你的代码工作得很好-一旦你在
打印
中添加了括号)

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


在Python3中,zip类似于izip,这是因为Python2试图通过获取生成器将产生的所有元素来创建列表。您需要的是迭代器,即
itertools.izip


在Python3中,zip的工作原理与izip类似,只需使用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
请注意,在Python3中,
itertools.izip
不存在,因为香草
zip
已经是一个迭代器


在itertools中也有一个函数,它在iterable上无限循环

生成一个迭代器,从iterable返回元素并保存 每份的复印件。当iterable耗尽时,从 保存的副本。无限期地重复


因此,
itertools.cycle(范围(5))
与您的
x(5)
做相同的事情;您还可以将
xrange(5)
传递到
循环
,这并不繁琐

您只需要使用
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
请注意,在Python3中,
itertools.izip
不存在,因为香草
zip
已经是一个迭代器


在itertools中也有一个函数,它在iterable上无限循环

生成一个迭代器,从iterable返回元素并保存 每份的复印件。当iterable耗尽时,从 保存的副本。无限期地重复


因此,
itertools.cycle(范围(5))
与您的
x(5)
做相同的事情;您还可以将
xrange(5)
传递到
循环
,这并不繁琐

据我所知,您试图同时迭代两个迭代器。如果没有其他办法,您可以始终使用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)

据我所知,您试图同时迭代两个迭代器。如果没有其他办法,您可以始终使用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)

你能在两个单独的线程中完成吗?
从itertools导入izip作为zip
@BurhanKhalid:或
从future\u builtins导入zip
。不错。需要跟上这些。你能在两个单独的线程中完成吗?
从itertools导入izip作为zip
@BurhanKhalid:或
从future\u builtins导入zip
。不错。我们需要跟上这些。