为什么在生成器上使用zip只返回一个项目?

4

我尝试在Python中运行此代码,希望得到[(1,123),(2,123)]的结果:

Python 2.7.3 (default, Feb 27 2014, 19:58:35)
>>> def my_generator():
...   yield 123
...
>>> zip([1,2], my_generator())
[(1, 123)]

为什么zip只创建了一个项目就停止了?有没有一种Pythonic的方法可以得到我想要的结果?


3
因为你的生成器只会产生一个项,我认为你对生成器的理解有误,而不是 zip 函数。 - BrenBarn
1个回答

7
创建一个无限生成器,就像这样:
def my_generator():
    while True:
        yield 123
print zip([1,2], my_generator())
# [(1, 123), (2, 123)]

更好的方法是使用itertools.repeat,像这样:
from itertools import repeat
print zip([1,2], repeat(123))
# [(1, 123), (2, 123)]

请使用 while True: 形式,这更符合 Python 的风格。 - rafgoncalves
根据文档,从Py2.3开始,解释器将"while 1"优化为单个跳转。相比之下,"while True"需要更多的步骤。虽然后者更易于理解,但对于时间关键的代码应使用第一种形式。 :) 无论如何,我已更新答案,请检查 :) - thefourtheye
好的,有一个合理的原因(刚学到)。请注意,这不适用于Py3。Py2.x实现没有将None、True和False作为关键字,因此它们实际上必须检查分配给那些变量的值。 - rafgoncalves

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接