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