如何使用 enumerate 装饰?

2021-01-11 17:54:55 +08:00
 fanqieipnet
如何使用 enumerate 装饰?今天番茄加速就来讲一下。

   enumerate 装饰

   for i, it in enumerate(iterators):

  ...

   iterators[i] = repeat(fillvalue)

   enumerate 装饰后会得到一个由 index 和元素本身组成的 tuple,举个例子:

   In [1]: for i,ele in enumerate([9,4,2,5,8]):

  ...: print((i,ele))

  ...:

  (0, 9)

  (1, 4)

  (2, 2)

  (3, 5)

  (4, 8)

  此处使用 enumerate,因后面先遍历完的 iter(a),为保证和 iter(b)个数对齐,需要填充 fillvalue 值,需要知道 a 的 index,此处为 0.

  捕获迭代终止异常

   try:

   value = next(it)

   except StopIteration:

  ...

   try… except 是异常捕获的标准模板,next(it)第一次执行返回 it 的第一个元素,a=[1,2,3],所以 value 值为 1.

  计数

   num_active 表示当前存活的列表个数,一旦一个列表迭代到终点,num_active 立即减 1

   num_active -= 1

   repeat

   iterators[i] = repeat(fillvalue)

   repeat 是 itertools 模块内另一个函数,如果 times 为默认值,则表示重复无限次,此处是一个 repeat 的典型用法。此处稍加注意,不要以为 times 参数默认值为 1,或者不理解为什么要无限次重复,记住这种用法。

  此处,repeat 返回一个无限次重复 fillvalue 值的迭代器,并赋值给此时触发 StopIteration 异常的列表。此处就是 iter(a),令其指向 repeat 创建的迭代器。

   yield 返回值

   value = fillvalue

   values.append(value)

   yield tuple(values)

  第一句,是在触发 StopIteration 时,将默认值 fillvalue 赋给 value,values 保存住列表对齐后位置的元素,第一次 for 退出时,values 内值为[1,4]
547 次点击
所在节点    推广
0 条回复

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/743943

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX