首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

揭秘 Python 中的 enumerate 函数

译者:Vimiix

作者:Dan Bader

译文:http://vimiix.com/post/2017/12/13/Pythons-enumerate-Function-Demystified/

如何以去写以及为什么你应该使用Python中的内置枚举函数来编写更干净更加Pythonic的循环语句?

Python的 函数是一个神话般的存在,以至于它很难用一句话去总结它的目的和用处。

但是,它是一个非常有用的函数,许多初学者,甚至中级Pythonistas是并没有真正意识到。简单来说, 是用来遍历一个可迭代容器中的元素,同时通过一个计数器变量记录当前元素所对应的索引值。

让我们来看一个示例:

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

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

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

用 让你的循环更加Pythonic

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

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

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

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

修改起始索引

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

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

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

背后是如何工作的

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

让我们演示一些更多的代码来表达我的意思:

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

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

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

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

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

是Python的一个内置函数。你应该充分利用它通过循环迭代自动生成的索引变量。

索引值默认从0开始,但也可以将其设置为任何整数。

函数是从2.3版本开始被添加到Python中的,详情见PEP279。

Python的函数可以帮助你编写出更加Pythonic和地道的循环结构,避免使用笨重且容易出错的手动生成索引。

为了充分利用的特性,一定要研究Python的迭代器和数据结构解包功能。

题图:pexels,CC0 授权。

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

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券