如果我在生成器中手动向前查看,我的枚举索引是否对应?

Ste*_* Lu 1 python

>>> gen = iter(['a','b','c','d'])
>>> for i, line in enumerate(gen):
...     print str(i) + ', ' + line
...     if (i == 1):
...         print 'saw 1'
...         print 'next: ' + gen.next()
...
0, a
1, b
saw 1
next: c
2, d
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,我更愿意看到3, d理解(我想保留一个不变量,如果你愿意:因为还有什么其他理由可以enumerate服务?)是i对应于索引的line.在next()接管了转储.

遗憾的是,这个尝试失败了,i因为设置为for循环认为它应该是什么:

>>> gen = iter(['a','b','c','d'])
>>> for i, line in enumerate(gen):
...     print str(i) + ', ' + line
...     if (i == 1):
...         print 'saw 1'
...         print 'next: ' + gen.next()
...         i = i + 1
...
0, a
1, b
saw 1
next: c
2, d
Run Code Online (Sandbox Code Playgroud)

答案是什么?沟渠enumerate手动跟踪指数?我希望有一些高级编程可以适应这种控制流程.

我正在解析一个文件,偶尔需要读取下一行的内容(如果它存在)(因此调用next()生成器),但我必须处理循环控制流.

因为我已经知道如何做到这一点,所以通过首先读出并完全评估生成器来做到这一点的答案将不被接受(但是随意发布这样的答案,我会赞成它).

jpm*_*c26 5

您可以一直使用enumerate迭代器.

>>> gen = enumerate(['a','b','c','d'])
>>> for i, line in gen:
...     print str(i) + ', ' + line
...     if (i == 1):
...         print 'saw 1'
...         print 'next: ' + gen.next()[1]
...
0, a
1, b
saw 1
next: c
3, d
Run Code Online (Sandbox Code Playgroud)

请注意索引以在打印时访问元组的第二个元素next.您也可以通过iter这种方式抛弃显式调用.如果你想要显式调用iter以防万一enumerate更改的行为,你应该把它放在外面(因为整个点是确保你正在处理迭代器):

>>> gen = iter(enumerate(['a','b','c','d']))
Run Code Online (Sandbox Code Playgroud)