使用enumerate代替range

2019-05-22 17:28发布

range是Python内置的一个方法可以用来循环一个数字的集合:

random_bits = 0
for i in range(64):
if randint(0, 1):
random_bits |= 1 << i

当你有一个数据结构需要迭代时,例如一组字符串,你可以之间循环遍历它:

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))

这个代码看起来有点蠢啊,在迭代的过程中你还不得不计算数组的长度,然后按照元素下标去迭代数组。

为了解决这种问题,Python提供了enumerate方法。enumerate将全部迭代器与一个惰性生成器(lazy generator)打包在了一起。这个生成器每次返回一个迭代器的值以及这个值的下标,使用enumerate重写上述代码:

for i, flavor in enumerate(flavor_list):
print('%d: %s' % (i + 1, flavor))
>>>
1: vanilla
2: chocolate
3: pecan
4: strawberry

通过使用enumerate的第二个参数,还可以进一步简化上面的代码:

for i, flavor in enumerate(flavor_list, 1):
print('%d: %s' % (i, flavor))

下面时enumerate的定义:

class enumerate(iterable, start)

enumerate(iterable[, start]) -> iterator for index, value of iterable

Return an enumerate object. iterable must be another object that supports iteration. The enumerate object yields pairs containing a count (from start, which defaults to zero) and a value yielded by the iterable argument. enumerate is useful for obtaining an indexed list:

(0, seq[0]), (1, seq[1]), (2, seq[2]), ...

在这里我们可以看到start的解释:返回序列的起始坐标值,默认是0。

文章来源: https://www.toutiao.com/group/6693437069286441485/