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

results matching ""

    No results matching ""