详解 Python的enumerate 函数

你应该在何时何地,如何使用内置的 enumerate() 函数来写出更加简洁、更加具有 Python 范儿的循环结构呢?

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

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

我们看一个例子:

上面代码的输出结果为

正如你所看到的那样,它对这个列表进行迭代,从零开始依次增加,产生每个元素的索引。

enumerate 使你的代码更具 Python 范儿

为什么使用 enumerate() 函数来产生元素的索引是很有用的呢?

我注意到那些从 C 或者 Java 转到 Python 的新用户在对一个列表进行 for 循环的时候会使用 range(len(---)) 这样的语句来追踪元素的索引。

正如我最上面举的那个例子,通过使用 enumerate() 函数可以使你的代码更加地道,更加具有 Python 范儿。

在 Python 中我们通常没有必要手动的生成元素的索引,完全可以将这种简单的任务扔给 enumerate() 函数。这样一来既提高了你的代码可读性,也减少了拼写错误的可能。

改变初始索引值

enumerate() 函数的另一个有用的特性就是它可以改变初始的索引值。 此函数接受一个可选择的缺省参数,这个参数可以用来设置索引计数器的初始值。

在上面的例子中,我简单的更改了函数的调用方法 enumeate(names, 1) 后面的这个参数 1 ,这样一来,我们索引的初始值便是 1 而不是 0。

以上过程就是如何使用 enumerate() 函数将来从 0 转换为从 1 索引(其他的整数都行)。

enumerate 函数的运行机制

你也许会好奇 enumerate() 函数背后运行的机制是什么。其一部分原理是 enumerate() 函数是作为 Python 的迭代器实现的。这就意味着元素索引的产生是按照时间序列一个一个产生(就像生成器),这也是这个函数在内存消耗小的情况下可以快速运行的原因。

我们用代码来展示一下其中的原理:

在上面的代码片段中,就像之前的例子一样,我创建了一个相同的枚举对象。但是我并没有直接使用循环去调用它,而是将它在控制台打印输出。

正如你看到的,它是一个枚举对象,其实也就是一个迭代器。就像我之前说的那样,当我需要的时候,它可以将结果一个一个地产生出来。

为了检查这些按需产生的元素,我们需要将其显示出来。在这里我对这个迭代器使用了内置函数 list。

对于list(name) 中的每个元素,通过 enumerate() 迭代器返回之后的可以得到一个元组形式的元素(index, element)。 在 for 循环中,你可以利用 Python 的数据结构解包功能来使用返回的结果,如下所示:

Python 的 enumerate 函数的关键点

1. enumerate() 函数是 Python 的内置函数。你可以在 for 循环中使用它,它可以自动产生可迭代对象中的元素索引。

2. 默认情况下索引计数器从零开始,但是你可以将其设置为任意的整数。

3. enumerate() 函数自 Python 2.3 开始便已添加,可以在 PEP 279 中看到它的用法。

4. enumerate() 函数可以帮我们写出更加地道的、更加具有 Python 范儿的循环结构,从而避免那些笨拙且易错的手动索引。

5. 为了更加详细的了解 enumerate() 函数,强烈建议你学习一下 python 的迭代器与数据结构解包。

英文原文:https://dbader.org/blog/python-enumerate

译者:无

公众号

推荐

&

国内最大的互联网、通信、电子、金融类内部推荐平台,团队成员直接收简历,一步到位,准确迅速!

工作机会来自于行业顶级的知名公司,职位包括但不限于软硬件工程师、产品经理、项目经理、销售、机械等各个方面,机会多多!

关注成员多来自211、985名校,清华东南北理工,两电一邮中科大!各地精英,共享资源,互推靠谱高薪职位!

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20171218A030CY00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券