我正在经历一个生成器,为什么他们需要特别小心,以Pythonic方式确定当前元素是否是生成器的第一个或最后一个元素?
谢谢
基本上生成标签,所以我有像
<div class="first">1</div>
<div>...</div>
<div class="last">n</div>
Run Code Online (Sandbox Code Playgroud)
所以我想保持循环中的最后一项?
这是一个类似枚举的生成器,可以向前跳过一个; 它为最后一个元素返回-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
Run Code Online (Sandbox Code Playgroud)
它无法判断传递给它的发电机是否"新鲜",但它仍然告诉你何时结束:
>>> 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
Run Code Online (Sandbox Code Playgroud)
一旦迭代器用完,它会StopIteration像往常一样升起.
>>> annotate(used_iter).next()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 2, in annotate
StopIteration
Run Code Online (Sandbox Code Playgroud)