冗余使用发电机?(蟒蛇)

Edg*_*ian 3 python iterator generator python-2.7

说我们做了以下事情:(忽略如果这是愚蠢的,或者如果有更好的方法,这是一个简化的例子)

from itertools import izip

def check(someList):
    for item in someList:
        yield item[0]

for items in izip(check(someHugeList1), check(someHugeList2)):
    //some logic
Run Code Online (Sandbox Code Playgroud)

由于check是一个生成器,使用izip是多余的?使用普通拉链会一样好吗?

Mar*_*ers 6

Regular zip()会首先扩展整个发生器.你不希望用巨大的或无穷无尽的发电机做到这一点.

演示:

>>> def gen():
...     print 'generating'
...     yield 'a'
... 
>>> gen()
<generator object gen at 0x10747f320>
>>> zip(gen(), gen())
generating
generating
[('a', 'a')]
Run Code Online (Sandbox Code Playgroud)

请注意,直接创建生成器不会打印任何内容; 发电机仍处于暂停状态.但是传递生成器会zip()立即产生输出,只能通过完全迭代生成器来生成输出.