在尝试解决特定的code golf问题时,我遇到了一个特定情况,我很难理解这种行为。
方案是zip
带有序列的迭代器,并且在转置操作之后,迭代器是一个超出预期元素的。
>>> l = range(10)
>>> it = iter(l)
>>> zip(it, range(5))
[(0, 0), (1, 1), (2, 2), (3, 3), (4, 4)]
>>> next(it) #expecting 5 here
6
我错过了一些明显的东西吗?
注意请为可能不明显的答案提供可靠的参考资料
答案 0 :(得分:3)
我怀疑,当5
试图压缩下一个项目时会消耗zip
。当其中一个arg为"空":
>>> l = range(10)
>>> it = iter(l)
>>> zip(range(5),it)
[(0, 0), (1, 1), (2, 2), (3, 3), (4, 4)]
>>> it.next()
5
通过撤消订单,zip知道它可以停止并且不会消耗它的下一个项目
答案 1 :(得分:1)
如果您想要参考,可以查看izip documentation。它提供了一个等效的实现:
def izip(*iterables):
iterators = map(iter, iterables)
while iterators:
yield tuple(map(next, iterators))
由于预期list(izip(*args))
与zip(*args)
具有相同的行为,因此您获得的结果实际上是逻辑行为。