zoukankan      html  css  js  c++  java
  • Python学习笔记之Python的enumerate函数

    Python 的 enumerate() 函数就像是一个神秘的黑箱,你无法简单地用一句话来概括这个函数的作用与用法。

    enumerate() 函数属于非常有用的高级用法,而对于这一点,很多初学者甚至中级学者都没有意识到。这个函数的基本应用就是用来遍历一个集合对象,它在遍历的同时还可以得到当前元素的索引位置。

    我们看一个例子:

    names = ["Alice","Bob","Carl"]
    for index,value in enumerate(names):
        print(f'{index}: {value}')

     这段代码会输入如下内容:

    0: Alice
    1: Bob
    2: Carl

    正如你所看到的,这个循环遍历了names列表的所有元素,并通过增加从零开始的计数器变量来为每个元素生成索引。

    [如果您想知道上面例子中使用的f'...'字符串语法,这是Python 3.6及更高版本中提供的一种新的字符串格式化技巧。]

    enumerate()让你的循环更加Python化

    那么为什么用enumerate()函数去保存运行中的索引很有用呢?

    我发现,有很多从C或Java背景转过来的新的Python开发人员有时使用下面这种range(len(...))方法来保存运行中每个元素的索引,同时再用for循环遍历列表:

    # 警告: 不建议这么写
    for i in range(len(my_items)):
        print(i, my_items[i])

    通过巧妙地使用enumerate()函数,就像我在上面的“names”例子中写的那样,你可以使你的循环结构看起来更Pythonic和地道。

    你不再需要在Python代码中专门去生成元素索引,而是将所有这些工作都交给enumerate()函数处理即可。这样,你的代码将更容易被阅读,而且减少写错代码的影响。(译者注:写的代码越多,出错几率越高,尽量将自己的代码看起来简洁,易读,Pythonic,才是我们的追求)


    修改起始索引

    另一个有用的特性是,enumerate()函数允许我们为循环自定义起始索引值。enumerate()函数中接受一个可选参数,该参数允许你为本次循环中的计数器变量设置初始值:

    names = ["Alice","Bob","Carl"]
    for index,value in enumerate(names,1):
        print(f'{index}: {value}')

    在上面的例子中,我将函数调用改为enumerate(names, 1),后面的参数1就是本次循环的起始索引,替换默认的0:

    1: Alice
    2: Bob
    3: Carl

    OK,这段代码演示的就是如何将Python的enumerate()函数默认0起始索引值修改为1(或者其他任何整形值,根据需求去设置不同值)

    enumerate()背后是如何工作的

    你可能想知道enumerate()函数背后是如何工作的。事实上他的部分魔法是通过Python迭代器来实现的。意思就是每个元素的索引是懒加载的(一个接一个,用的时候生成),这使得内存使用量很低并且保持这个结构运行很快。

    请看如下代码:

    >>> names = ['Alice', 'Bob', 'Carl']
    >>> enumerate(names)
    <enumerate object at 0x1057f4120>

    在上面这个代码片段中,正如你所见,我使用了和前面一样的示例代码。但是,调用enumerate()函数并不会立即返回循环的结果,而只是在控制台中返回了一个enumerate对象。

    正如你所看到的,这是一个“枚举对象”。它的确是一个迭代器。就像我说的,它会在循环请求时懒加载地输出每个元素。

    为了验证,我们可以取出那些“懒加载”的元素,我计划在这个迭代器上调用Python的内置函数list()。

    >>> list(enumerate(names))
    [(0, 'Alice'), (1, 'Bob'), (2, 'Carl')]

    对于输入list()中的每个enumerate()迭代器元素,迭代器会返回一个形式为(index,element)的元组作为list的元素。在典型的for-in循环中,你可以利用Python的数据结构解包功能来充分利用这一点特性:

    for index, element in enumerate(iterable):
        # ...

     总结:Python中的enumerate函数 - 关键点

    • enumerate是Python的一个内置函数。你应该充分利用它通过循环迭代自动生成的索引变量。
    • 索引值默认从0开始,但也可以将其设置为任何整数。
    • enumerate函数是从2.3版本开始被添加到Python中的,详情见PEP279
    • Python的enumerate函数可以帮助你编写出更加Pythonic和地道的循环结构,避免使用笨重且容易出错的手动生成索引。
    • 为了充分利用enumerate的特性,一定要研究Python的迭代器和数据结构解包功能。

    参考

  • 相关阅读:
    解决ubuntu中firefox浏览器总是提示找不到server的问题
    Android学习笔记(14):相对布局RelativeLayout
    浅析java(多方面解读)
    做自己
    SGU 261. Discrete Roots (N次剩余)
    hdu1115 Lifting the Stone(几何,求多边形重心模板题)
    Android编码规范
    hdu 3790 最短路径问题
    怎样在gluster的源代码中加入自己的xlator
    处理空列表
  • 原文地址:https://www.cnblogs.com/JetpropelledSnake/p/9175165.html
Copyright © 2011-2022 走看看