Pythonic:范围与枚举在python for循环中

12 python for-loop coding-style

你能告诉我为什么当我需要索引和循环列表时的值并使用时,它被认为是"不是pythonic":

a = [1,2,3]
for i in range(len(a)):
  # i is the idx
  # a[i] is the value
Run Code Online (Sandbox Code Playgroud)

但建议使用

for idx, val in enumerate(a):
  print idx, val
Run Code Online (Sandbox Code Playgroud)

谁定义了"pythonic",为什么后者更好?我的意思是它在可读性方面没有那么好,是吗?

提前致谢

Thi*_*ter 11

首先,第一种方式是丑陋的:你要么需要一个单独的变量赋值获取该元素或使用a[i]其可以在所有的时间在理论上是一个昂贵的操作.想象一下,a作为一个数据库游标:当你迭代它(a.__iter__被调用)时,对象可以安全地假设你将迭代它的所有项目.因此可以一次检索所有或至少多行.当获得长度时,这样的优化将是愚蠢的,因为你肯定不想仅仅因为你想要项目的数量来检索数据.此外,在检索特定项目时,您也不能假设其他项目也将被检索.

此外,使用任何可迭代的enumerate()工作,同时只适用于可数的可索引对象.range(len())

  • 当您想重复访问索引处的列表/可迭代项时,枚举会更快。当您只需要索引列表时,使用 len() 和 range(Python 2.x 中的 xrange)会更快。 (4认同)
  • 谢谢,特别是您的最后一段对我来说是一个很好的理由,因为否则我将不得不始终使用会适得其反和不合常规的不同版本。我认为最好再使用相同的方法更好,更清洁:-) (3认同)