Effective Python 第7条:enumerate取代range

range可以用来迭代一系列整数,如下:

for i in range(10):
    print(i)

当我们迭代数据结构,例如字符串列表,可以直接在这个序列上迭代,如下:

flavor_list = ['vanilla', 'chocolate', 'pecan']
for flavor in flavor_list:
    print(f'{flavor} is delicious')
# vanilla is delicious
# chocolate is delicious
# pecan is delicious

但是当我们迭代list的过程中,要知道元素在list里的位置时,就需要使用range,如下:

flavor_list = ['vanilla', 'chocolate', 'pecan']
for i in range(len(flavor_list)):
    flavor = flavor_list[i]
    print(f'{i+1}: {flavor}')
# 1: vanilla
# 2: chocolate
# 3: pecan

但是上面步骤太多了,我们可以使用enumerate简化。enumerate能够把任何一种迭代器(iterator)封装成惰性生成器(lazy generator,参见第30条)。这样每次循环就从iterator获取下一个值,同时还会给出本轮循环的序号,即生成器每次产生一对输出值。下面通过内置的next函数手动推进enumerate所返回的这个iterator。如下:

it = enumerate(flavor_list)
print(next((it)))
print(next((it)))
# (0, 'vanilla')
# (1, 'chocolate')

enumerate输出的每一对数据,都可以拆分(unpacking)到for语句两个变量里,如下:

for i, flavor in enumerate(flavor_list):
    print(f'{i+1}: {flavor}')
# 1: vanilla
# 2: chocolate
# 3: pecan

还可以通过enumerate的第二个参数指定起始序列号,如下,从1开始:

for i, flavor in enumerate(flavor_list, 1):
    print(f'{i}: {flavor}')
# 1: vanilla
# 2: chocolate
# 3: pecan

要点

  1. enumerate函数可以简洁的代码迭代iterator,而且可以指出当前这轮循环的序号。
  2. 使用enumerate取代range指定下标的取值。
  3. 可以通过enumerate的第二个参数指定起始序号(默认为0)。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ethan-running

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值