enumerate 比range更好用
迭代
迭代一个数值型的集合时,使用内置的range
函数是一个很不错的选择,例如:
from random import *
random_bits = 0
for i in range(64):
if randint(0,1):
random_bits |= 1 << i
当你有一个待 迭代的数据结构(比方说字符串内容的集合)的时候,你就可以直接循环处理了,而不需要使用range
函数。
flavor_list = ['vanilla', 'chocolate', 'pecan', 'strawberry']
for flavor in flavor_list:
print("%s is delicious."%flavor)
很多时候,你想在迭代一个集合的同时获悉当前值在列表中的下标。例如:你想打印出你最喜爱的冰淇淋口味的范围,一种方式是使用range
来完成。
for i in range(len(flavor_list)):
flavor = flavor_list[i]
print("%d:%s"%(i+1, flavor))
与其他的迭代集合或者range
范围的例子想必,这段代码看起来很是笨拙。你不得不先计算出列表的长度,还必须将这个数组索引化。所以,代码阅读起来就显得很困难。
枚举
其实针对于这种情况,Python
提供了一个枚举函数。枚举函数可以使用懒模式来包装任何的迭代器。这对字段就代表了迭代器中当前项的下标以及值,这样一来,代码就显得很干净整洁了。
for i, flavor in enumerate(flavor_list):
print("%d:%s"%(i+1,flavor))
>>>
1: vanilla
2: chocolate
3:pecan
4:strawberry
你也可以通过指定 索引开始的下标序号来简化代码,如下:
for i, flavor in enumerate(flavor_list,1):
print("%d: %s"%(i,flavor))
>>>
1: vanilla
2: chocolate
3:pecan
4:strawberry
备忘录
enumerate
提供了简洁的语法,再循环迭代一个迭代器的同时既能获取下标,也能获取当前值。- 在索引化一个序列的时候,应该避免使用
range
方式,而应该使用enumerate
的方式。 - 可以添加第二个参数来指定 索引开始的序号,默认为
0
。