Abh*_*pta 20 python loops for-loop yield generator
我有两个发电机说A()和B().我想一起迭代两个生成器.就像是:
for a,b in A(),B(): # I know this is wrong
#do processing on a and b
Run Code Online (Sandbox Code Playgroud)
一种方法是将两个函数的结果存储在列表中,然后遍历合并列表.像这样的东西:
resA = [a for a in A()]
resB = [b for b in B()]
for a,b in zip(resA, resB):
#do stuff
Run Code Online (Sandbox Code Playgroud)
如果您想知道,那么两个函数都会产生相同数量的值.
但是我不能使用这种方法因为A()/B()返回了这么多的值.将它们存储在列表中会耗尽内存,这就是我使用生成器的原因.
有没有办法一次循环两个发电机?
Mar*_*ers 31
你快到了.在Python 3中,只需将生成器传递给zip():
for a, b in zip(A(), B()):
Run Code Online (Sandbox Code Playgroud)
zip()采用任何可迭代的,而不仅仅是列表.它将逐个消耗发电机.
在Python 2中,使用itertools.izip():
from itertools import izip
for a, b in izip(A(), B()):
Run Code Online (Sandbox Code Playgroud)
顺便说一句,将发电机变成列表就像这样简单list(generator); 不需要在那里使用列表理解.