今天的原文的做者是来自国外的觉得Python“布道师”Dan Bader,他的博客彻底就是一个我的品牌的学校。有跟多Python技巧,有不少他录制的Youtube视频,国内的Pythonista们,不妨订阅一下他的每周邮件推送。订阅连接python
今天的译文是他博客中的一篇,点击查看原文vim
如何以去写以及为何你应该使用Python中的内置枚举函数来编写更干净更加Pythonic的循环语句?数据结构
Python的enumerate
函数是一个神话般的存在,以致于它很难用一句话去总结它的目的和用处。函数
可是,它是一个很是有用的函数,许多初学者,甚至中级Pythonistas是并无真正意识到。简单来讲,enumerate()
是用来遍历一个可迭代容器中的元素,同时经过一个计数器变量记录当前元素所对应的索引值。oop
让咱们来看一个示例:ui
names = ['Bob', 'Alice', 'Guido']
for index, value in enumerate(names):
print(f'{index}: {value}')
复制代码
这段代码会输入以下内容:spa
0: Bob
1: Alice
2: Guido
复制代码
正如你所看到的,这个循环遍历了names
列表的全部元素,并经过增长从零开始的计数器变量来为每一个元素生成索引。code
[若是您想知道上面例子中使用的f'...'字符串语法,这是Python 3.6及更高版本中提供的一种新的字符串格式化技巧。]orm
enumerate()
让你的循环更加Pythonic那么为何用enumerate()
函数去保存运行中的索引颇有用呢?cdn
我发现,有不少从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:
1: Bob
2: Alice
3: Guido
复制代码
OK,这段代码演示的就是如何将Python的enumerate()
函数默认0起始索引值修改成1(或者其余任何整形值,根据需求去设置不一样值)
enumerate()
背后是如何工做的你可能想知道enumerate()
函数背后是如何工做的。事实上他的部分魔法是经过Python迭代器来实现的。意思就是每一个元素的索引是懒加载的(一个接一个,用的时候生成),这使得内存使用量很低而且保持这个结构运行很快。
让咱们演示一些更多的代码来表达个人意思:
>>> names = ['Bob', 'Alice', 'Guido']
>>> enumerate(names)
<enumerate object at 0x1057f4120>
复制代码
在上面这个代码片断中,正如你所见,我使用了和前面同样的示例代码。可是,调用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):
# ...
复制代码
enumerate
是Python的一个内置函数。你应该充分利用它经过循环迭代自动生成的索引变量。enumerate
函数是从2.3版本开始被添加到Python中的,详情见PEP279。enumerate
函数能够帮助你编写出更加Pythonic和地道的循环结构,避免使用笨重且容易出错的手动生成索引。enumerate
的特性,必定要研究Python的迭代器和数据结构解包功能。译者博客:vimiix.com