这是一个类似枚举的生成器,它会向前跳过一个;它为最后一个元素返回 -1。
>>> def annotate(gen):
... prev_i, prev_val = 0, gen.next()
... for i, val in enumerate(gen, start=1):
... yield prev_i, prev_val
... prev_i, prev_val = i, val
... yield '-1', prev_val
>>> for i, val in annotate(iter(range(4))):
... print i, val
...
0 0
1 1
2 2
-1 3
它无法判断传递给它的生成器是否“新鲜”,但它仍然会告诉你何时结束:
>>> used_iter = iter(range(5))
>>> used_iter.next()
0
>>> for i, val in annotate(used_iter):
... print i, val
...
0 1
1 2
2 3
-1 4
一旦迭代器用完,它就会像往常一样引发StopIteration。
>>> annotate(used_iter).next()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 2, in annotate
StopIteration