前面在学习循环中,已经学习了list的迭代:
programLanguages = ['Java', 'C', 'C++', 'Objective-C', 'Swift']
for lang in programLanguages:
print(lang)
运行结果:
Java
C
C++
Objective-C
Swift
如果,想同时打印出索引,形如:
0 Java
1 C
2 C++
3 Objective-C
4 Swift
我们当然可以这样来实现:
programLanguages = ['Java', 'C', 'C++', 'Objective-C', 'Swift']
i = 0
for lang in programLanguages:
print(i, lang)
i = i+1
运行结果:
0 Java
1 C
2 C++
3 Objective-C
4 Swift
我们当然可以通过额外添加变量,来记录遍历的索引的方式实现,但是太麻烦了。Python为我们提供了一个内置函数enumerate()
:
enumerate函数说明:
函数原型:enumerate(sequence, [start=0])
功能:将可循环序列sequence以start开始分别列出序列数据和数据下标。如果省略start赋值,则默认从0索引位置开始。
对于一个可迭代的(iterable)/可遍历的对象(如列表、字符串),enumerate将其组成一个索引序列,利用它可以同时获得索引和值。
利用enumerate()函数,实现方式为:
programLanguages = ['Java', 'C', 'C++', 'Objective-C', 'Swift']
for index, value in enumerate(programLanguages):
print(index, value)
运行结果:
0 Java
1 C
2 C++
3 Objective-C
4 Swift
当然这里的index
,value
可以用任意合法的标识,如:x,y
,修改后重新运行:
programLanguages = ['Java', 'C', 'C++', 'Objective-C', 'Swift']
for x, y in enumerate(programLanguages):
print(x, y)
运行结果:
0 Java
1 C
2 C++
3 Objective-C
4 Swift
这种语法糖,和Swift中一样。无论我们把这里定义成见名知义的index
,value
还是其他任意合法的标识,如:x,y
,遍历时,利用enumerate()得到的(index, programLanguages[index]),会自动分别拆包赋值给前面的两个变量,例如index-->x, programLanguages[index]-->y,所以print(x, y)
,会得到上面结果。
如果,我们只定义一个变量来接收,会是什么样?修改代码如下:
programLanguages = ['Java', 'C', 'C++', 'Objective-C', 'Swift']
for lang in enumerate(programLanguages):
print(lang)
运行结果:
(0, 'Java')
(1, 'C')
(2, 'C++')
(3, 'Objective-C')
(4, 'Swift')
可以看到,每一个lang是一个(0, 'Java'),这里包含了索引和值。当我们只用一个变量去接收时,接收到的是未拆包的(index, value)
;当我们用两个变量去接收时,会自动将(index, value)
拆包并赋值给前面的两个变量,如上个例子中的index,value或x,y。
如果用3个变量去接收,又会出现什么结果?会报ValueError
。例如:用x,y,x三个变量,则:
programLanguages = ['Java', 'C', 'C++', 'Objective-C', 'Swift']
for x, y, z in enumerate(programLanguages):
print(x, y, z)
运行结果:
Traceback (most recent call last):
File "F:/python_projects/14enumrate.py", line 11, in <module>
for x, y, z in enumerate(programLanguages):
ValueError: not enough values to unpack (expected 3, got 2)
意思是:
for x, y, z in enumerate(programLanguages):
值错误:没有足够的值来拆包赋值(期望3个,得到2个)
小结
本文重点学习Python中很常见的用enumerate()函数迭代,利用它可以同时获得索引和值,和一些注意事项。
更多了解,可关注公众号:人人懂编程
微信公众号:人人懂编程
网友评论