似乎PEP 479(更改生成器内的StopIteration处理)带来了许多不便。 zip等价的示例代码(来自python的2.7文档,我自己略有改动):
def izip(*iterables):
# izip('ABCD', 'xy') --> Ax By
iterators = list(map(iter, iterables))
while True:
yield tuple(map(next,iterators))
zipper = izip([1,2],[3,4])
下(拉链)
(1,3)
下(拉链)
(2,4)
下(拉链)
()
下(拉链)
()
map()内置生成器吞下由Next()引发的StopIteration,因此拉链生成器永远不会结束。我甚至无法在izip中捕获异常,因为问题存在于map()内部。有没有pythonic方法来解决这个问题而不编写自定义地图()?
答案 0 :(得分:1)
在这种情况下,您可以检查tuple
的{{1}}的长度,并在yield
的长度小于iterators
的情况下中断循环:
def izip(*iterables):
iterators = list(map(iter, iterables))
while True:
t = tuple(map(next,iterators))
if len(t) != len(iterators):
break
yield t
zipper = izip([1, 2], [3, 4])
print(next(zipper)) # (1, 2)
print(next(zipper)) # (3, 4)
print(next(zipper)) # StopIteration