首先我们来了解一下enumerate()函数的语法
语法
enumerate( sequence, [start = 0])
其中,第一个参数是一个可迭代的序列,第二个参数start则是序列中首个元素的行号从几开始(默认从0开始)。
简单用例
l1 = [x**2 for x in range(5)]
for index, value in enumerate(l1):
print(index, value)
--------------------------------------------------------------------
l1 = [x**2 for x in range(5)]
for index, value in enumerate(l1, start=2):
print(index, value)
二者的输出结果分别是
(注意enumerate中的start参数变化)
0 0 | 2 0
1 1 | 3 1
2 4 | 4 4
3 9 | 5 9
4 16 | 6 16
注意下面(x, y, z)的括号不可以去掉!
l1 = [(1, 2, 3), (2, 3, 4), (3, 4, 5)]
for index, (x, y, z) in enumerate(l1):
print(index, x, y, z)
返回值
enumerate()函数返回的是enumerate对象实例,他是一个迭代器,可返回连续的元组。元组由索引值和对传入的序列不断调用next()方法得到的值组成。
enumerate()应用
记录文件错误信息的行号
了解了enumerate函数的用法后,我们可以更加方便处理一些迭代序列的问题。想象一下你有一个存有海量内容的txt文件,我们正在对该文件的内容进行修改,往往我们会遇到修改出错的情况, 我们根据原始报错的内容来定位文件中的错误耗时且费力。而用enumerate函数来实现记录文件中错误信息的行号就可以大大提高效率。
现在有一个名叫123的txt文件,内容如下:
如下定义了一个open_file函数对文件内容进行操作,显然try语句会触发ValueError。
def open_file(filename):
with open(filename, 'rt') as f:
for index, line in enumerate(f, 1):
fields = line.split()
print(fields)
try:
print(int(fields[0]))
except ValueError as e:
print('File_Line {}:The reason of error: {}'.format(index, e))
data = r"C:\Users\Administrator\Desktop\123.txt"
open_file(data)
因为for循环结束时临时变量line指向文件最后一行,所以field[0]是goodbye这个单词,即错误会发生在goodbye上。我们再来看看代码的运行结果。
该代码的运行结果如下:
可以看到,错误信息清楚地指出了文件第四行goodbye单词发生错误。
更加优雅的计数器
以往我们写计数器,一般都是先创建变量并赋初值,然后让该变量在循环里改变相应的值。
用enumerate函数之前:
l1 = [x for x in range(10)]
count = 0
for num in l1:
...
count += 1
用enumerate函数之后:
l1 = [x for x in range(10)]
count = 0
for count, value in enumerate(l1):
...