Effective Python(10): 序列数据尽量用enu
2019-10-04 本文已影响0人
warmsirius
一、range
函数迭代序列
在一系列整数上面迭代时,内置的
range
函数很有用。
例1:按位生成小于264的随机整数:
from random import randint
random_bits = 0
for i in range(64):
if randint(0, 1):
random_bits |= 1 << i # 优先计算 <<(左移)运算,然后计算|(按位或)运算
print(random_bits)
# 8218395160303362446
例2:直接迭代列表
迭代序列式数据结构,可以直接在上面迭代:
flavor_list = ['vanilla', 'chocoloate', 'pecan', 'strawberry']
for flavor in flavor_list:
print("%s is delicious" % flavor)
# vanilla is delicious
# chocoloate is delicious
# pecan is delicious
# strawberry is delicious
当迭代列表时,通常还想知道当前元素在列表中的索引。
- 方法一:利用
range
来实现
flavor_list = ['vanilla', 'chocoloate', 'pecan', 'strawberry']
for i in range(len(flavor_list)):
flavor = flavor_list[i]
print("%d: %s" % (i+1, flavor))
# 1: vanilla
# 2: chocoloate
# 3: pecan
# 4: strawberry
- 方法二:
numerate
函数迭代序列
flavor_list = ['vanilla', 'chocoloate', 'pecan', 'strawberry']
for i, flavor in enumerate(flavor_list):
print("%d: %s" % (i+1, flavor))
# 1: vanilla
# 2: chocoloate
# 3: pecan
# 4: strawberry
二、enumerate
函数
-
enumerate
可以把各种迭代器包装成生成器,以便稍后产生输出值。
生成器每次产生一对输出值,其中,前者表示循环下标,后者表示从迭代器中获取到的下一个序列元素
- 可以指定
enumerate
函数开始计数时所用的值
本例从1开始计数
flavor_list = ['vanilla', 'chocoloate', 'pecan', 'strawberry']
for i, flavor in enumerate(flavor_list, 1):
print("%d: %s" % (i, flavor))
# 1: vanilla
# 2: chocoloate
# 3: pecan
# 4: strawberry
三、要点
-
enumerate
函数提供了一种精简的写法,可以在遍历迭代器时获知每个元素的索引 - 尽量用
enumerate
来改写那种将range
与下标访问相结合的序列遍历代码 - 可以给
enumerate
提供第二个参数,以指定开始计数时所用的值(默认为0)