Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Pythonic:python for循环中的范围与枚举_Python_For Loop_Coding Style - Fatal编程技术网

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

Pythonic:python for循环中的范围与枚举,python,for-loop,coding-style,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”下了定义?为什么后者更好?我的意思是它的可读性并没有那么好,是吗 首先,第一种方法很难看:要么需要一个单独的变量赋值来获取元

请告诉我,当我需要索引和值时,在列表上循环并使用时,为什么它被视为“非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”下了定义?为什么后者更好?我的意思是它的可读性并没有那么好,是吗


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


此外,使用
enumerate()
可以处理任何可数对象,而
range(len())
只能处理可数、可索引对象。

可能重复我的意思是,在可读性方面没有那么好,是吗!?实际上是这样的,因为第一个示例使用了一行额外的codeVoting来重新打开。这在某种程度上取决于观点,但有充分的理由选择第二个版本,如@ThiefMaster的回答所示。谢谢,很高兴听到我在第一篇文章中没有真正违反规则:-)谢谢,特别是你的最后一段对我来说是一个很好的理由,因为否则我总是不得不使用不同的版本,这将适得其反,不规则。我认为总是使用相同的方法更好、更干净,而:-)当您希望在索引处重复访问列表/可编辑项时,枚举速度更快。当您只需要索引列表时,使用len()和range(Python2.x中的xrange)会更快。