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

时间:2014-06-10 21:01:53

标签: 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

但建议使用

for idx, val in enumerate(a):
  print idx, val

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

提前致谢

1 个答案:

答案 0 :(得分:11)

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

此外,使用enumerate()适用于任何可迭代,而range(len())仅适用于可数,可索引对象。