Python: enumerate() 函数 [以记录元素索引的方式迭代序列]

首先我们来了解一下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):
	...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值