揭秘 Python 中的 enumerate() 函数
原文:https://mp.weixin.qq.com/s/Jm7YiCA20RDSTrF4dHeykQ
如何以去写以及为什么你应该使用Python中的内置枚举函数来编写更干净更加Pythonic的循环语句?
Python的 enumerate函数是一个神话般的存在,以至于它很难用一句话去总结它的目的和用处。
但是,它是一个非常有用的函数,许多初学者,甚至中级Pythonistas是并没有真正意识到。简单来说, enumerate()是用来遍历一个可迭代容器中的元素,同时通过一个计数器变量记录当前元素所对应的索引值。
让我们来看一个示例:
names = ['Bob', 'Alice', 'Guido']for index, value in enumerate(names):print(f'{index}: {value}')
这段代码会输入如下内容:
正如你所看到的,这个循环遍历了 names列表的所有元素,并通过增加从零开始的计数器变量来为每个元素生成索引。
[如果您想知道上面例子中使用的f'...'字符串语法,这是Python 3.6及更高版本中提供的一种新的字符串格式化技巧。]
用 enumerate()让你的循环更加Pythonic
那么为什么用 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 = ['Bob', 'Alice', 'Guido']for index, value in enumerate(names, 1):print(f'{index}: {value}')
在上面的例子中,我将函数调用改为 enumerate(names, 1),后面的参数1就是本次循环的起始索引,替换默认的0:
OK,这段代码演示的就是如何将Python的 enumerate()函数默认0起始索引值修改为1(或者其他任何整形值,根据需求去设置不同值)
enumerate()背后是如何工作的
你可能想知道 enumerate()函数背后是如何工作的。事实上他的部分魔法是通过Python迭代器来实现的。意思就是每个元素的索引是懒加载的(一个接一个,用的时候生成),这使得内存使用量很低并且保持这个结构运行很快。
让我们演示一些更多的代码来表达我的意思:
>>> names = ['Bob', 'Alice', 'Guido']>>> enumerate(names)
在上面这个代码片段中,正如你所见,我使用了和前面一样的示例代码。但是,调用 enumerate()函数并不会立即返回循环的结果,而只是在控制台中返回了一个 enumerate对象。
正如你所看到的,这是一个"枚举对象"。它的确是一个迭代器。就像我说的,它会在循环请求时懒加载地输出每个元素。
为了验证,我们可以取出那些"懒加载"的元素,我计划在这个迭代器上调用Python的内置函数 list()
>>> list(enumerate(names))[(0, 'Bob'), (1, 'Alice'), (2, 'Guido')]
对于输入 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的迭代器和数据结构解包功能。
揭秘 Python 中的 enumerate() 函数的更多相关文章
- Python中的enumerate函数的作用
enumerate函数是将一个可迭代对象中元素,按元素顺序每个增加一个索引值,将其组成一个索引序列,利用它可以同时获得索引和值,这样做的目的是为了将一个可迭代对象中元素组成一个"索引,值&q ...
- python中的enumerate函数
enumerate 函数用于遍历序列中的元素以及它们的下标: >>> for i,j in enumerate(('a','b','c')): print i,j 0 a1 b2 c ...
- python中的enumerate函数用于遍历序列中的元素以及它们的下标
enumerate 函数用于遍历序列中的元素以及它们的下标: >>> for i,j in enumerate(('a','b','c')): print i,j 0 a1 b2 c ...
- python中的enumerate()函数用法
enumerate函数用于遍历序列中的元素以及它们的下标,可以非常方便的遍历元素. 比如我在往excel中写数据时就用到了这个函数: data = [] data.append(('预约码', '车牌 ...
- python中的enumerate 函数(编号的实现方式)
enumerate 函数用于遍历序列中的元素以及它们的下标: 默认从0开始,如果想从1开始,可以仿照最后案例 加上逗号,和数字编号 >>> for i,j in enumerate( ...
- 【python】python中的enumerate()函数【笔记】
结合实例来理解比较好,网上找了一下这个enumerate用法,自己也记录一下加深印象 看一下相关链接: 链接1:http://www.cnblogs.com/danielStudy/p/6576040 ...
- python --- Python中的callable 函数
python --- Python中的callable 函数 转自: http://archive.cnblogs.com/a/1798319/ Python中的callable 函数 callabl ...
- python中使用zip函数出现<zip object at 0x02A9E418>
在Python中使用zip函数,出现<zip object at 0x02A9E418>错误的原因是,你是用的是python2点多的版本,python3.0对python做了改动 zip方 ...
- [转载]python中multiprocessing.pool函数介绍
原文地址:http://blog.sina.com.cn/s/blog_5fa432b40101kwpi.html 作者:龙峰 摘自:http://hi.baidu.com/xjtukanif/blo ...
随机推荐
- MyBatis使用小案例
首先回顾一下MyBatis封装简化Dao层连接数据库操作的顺序. 首先MyBatis是一个引入的jar包,还有一些依赖包,可能用不到的jar包,一并引入就好了,再多引入一个Juntil.jar测试包( ...
- jQuery实现鼠标点击Div区域外隐藏Div
冒泡定义:当一个元素上的事件被触发的时候,比如说鼠标点击了一个按钮,同样的事件将会在那个元素的所有祖先元素中被触发.这一过程被称为事件冒泡:这个事件从原始元素开始一直冒泡到DOM树的最上层.(摘自网络 ...
- Codeforces Round #417 (Div. 2) B. Sagheer, the Hausmeister
http://codeforces.com/contest/812/problem/B 题意: 有n层楼,每层楼有m个房间,1表示灯开着,0表示灯关了.最两侧的是楼梯. 现在每从一个房间移动到另一个房 ...
- 使用IDEA2017创建java web +maven项目
1.首先,提前准备的东西:我使用的是IDEA2017,tomcat7,jdk1.:请将这些软件安装完成,环境变量配置完成,如何配置以及安装我就不复述了,百度上一堆一堆的,比我知道的详细多了. 2.下面 ...
- c++ 判断容器是否为空
#include <iostream> #include <vector> #include <string> using namespace std; int m ...
- lua 删除table元素
tab1 = { key1 = "val1", key2 = "val2", "val3" } for k, v in pairs(tab1 ...
- Binding.RelativeSource 属性
Binding.RelativeSource 属性说明: 通过指定绑定源相对于绑定目标的位置,获取或设置绑定源. 此属性通常用于将对象的某个属性绑定到该对象的另一个属性,或用于在样式或模板中定义绑定. ...
- HDU-1794 方格填数 (贪心+四分)
题目大意:给一个由自然数构成的nxn方阵,其中有k个元素为0,现在要从给出的m个元素中挑出k个填入矩阵,是和的增量最大.和定义为所有子方阵上的元素之和. 题目分析:对于尺寸固定的方阵,计算和的时候每个 ...
- 从数组里随机获取N项
基础知识: 复制数组: (1)循环遍历复制(不推荐) var arry = [1,5,9,7], new_arry = [], n = 0, len = arry.length; for(;n< ...
- 【转】 linux的网络接口之扫盲
[转] linux的网络接口之扫盲 转自:http://blog.csdn.net/zhangxinrun/article/details/6820433 (1)网络接口的命名 这里并不存在一定的命名 ...