I was writing an answer to this question when noticed that my simple implementation didn\'t produce correct results. While hunting down the bug, I noticed the following:
This happens because zip
evaluates iterators from left to right, meaning that, after three steps, it calls next()
on gen
and only then on iter(range(3))
(or something like that) and encounters a StopIteration
. To get around this, use the shorter (finite) iterable as the left-most argument:
In [8]: zip(range(3), gen)
0
1
2
Out[8]: [(0, 0), (1, 1), (2, 2)]