15.Python编程:用enumerate()迭代

作者: TensorFlow开发者 | 来源:发表于2018-04-09 18:37 被阅读4次

前面在学习循环中,已经学习了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()函数迭代,利用它可以同时获得索引和值,和一些注意事项。


更多了解,可关注公众号:人人懂编程


微信公众号:人人懂编程

相关文章

网友评论

    本文标题:15.Python编程:用enumerate()迭代

    本文链接:https://www.haomeiwen.com/subject/pskihftx.html