当我们需要迭代一个序列,但是又希望记录下序列中当前处理到的元素索引时,内建的enumerate函数可以漂亮的解决这个问题。
>>> items = ['a', 'b', 'c']
>>> for idx, val in enumerate(items):
print(idx, val)
0 a
1 b
2 c
如果需要打印规范的行号,enumerate函数可以接受一个行号起始的可选参数
>>> for idx, val in enumerate(items, 1):
print(idx, val)
1 a
2 b
3 c
这种情况特别适合用于追踪记录文件中的行号,当想在错误信息中加上行号时就特别有用。
enumerate函数的返回值是一个enumerate对象实例,它是一个迭代器,可以返回连续的元组。元组由一个索引值和对传入的序列调用next()而得到的值组成。
但这里有一个小问题。在元组序列上应用enumerate函数时,如果元组本身也需要被分解展开的话则会出错。
>>> data = [(1, 2), (3, 4), (5, 6)]
>>> #Correct!
>>> for idx, (x,y) in enumerate(data):
print(idx, x, y)
0 1 2
1 3 4
2 5 6
>>> #Error!
>>> for idx, x, y in enumerate(data):
print(idx, x, y)
Traceback (most recent call last):
File "<pyshell#13>", line 1, in <module>
for idx, x, y in enumerate(data):
ValueError: not enough values to unpack (expected 3, got 2)