你想在迭代一个序列的同时跟踪正在被处理的元素索引?内置的enumerate() 函数可以很好的解决这个问题:
1 list_c = ['a', 'b', 'c'] 2 for i, c in enumerate(list_c): 3 print(i, c)
为了按传统行号输出(行号从1 开始),你可以传递一个开始参数:
1 list_c = ['a', 'b', 'c'] 2 for i, c in enumerate(list_c, 1): 3 print(i, c)
利用enumerate()函数,在你遍历文件时想在错误消息中使用行号定位时候非常有用:
1 def parser_file(filename): 2 with open(filename) as f: 3 for line_no, line in enumerate(f): 4 fields = line.split('=') 5 try: 6 count = int(fields[0]) 7 print(count) 8 except ValueError as e: 9 print("line {0} parse error:[{1}]".format(line_no, e)) 10 11 12 def main(): 13 parser_file("test.txt") 14 15 if __name__ == '__main__': 16 main()
enumerate() 函数返回的是一个enumerate 对象实例,它是一个迭代器,返回连续的包含一个计数和一个值的元组,元组中的值通过在传入序列上调用next() 返回。
还有一点可能并不很重要,但是也值得注意,有时候当你在一个已经解压后的元组序列上使用enumerate() 函数时很容易调入陷阱。你得像下面正确的方式这样写:
t_list = [(1, 2), (3, 4), (5, 6)] # Error! for i, x, y in enumerate(t_list, 1): print("{0}:({1}, {2})".format(i, x, y)) # Correct! for i, (x, y) in enumerate(t_list, 1): print("{0}:({1}, {2})".format(i, x, y)