【问题标题】:Pythonic: range vs enumerate in python for loop [closed]Pythonic:python for循环中的范围与枚举[关闭]
【发布时间】:2017-04-22 11:08:44
【问题描述】:

您能否告诉我,当我在循环列表和使用时需要索引和值时,为什么它被认为是“非 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”,为什么后者更好?我的意思是在可读性方面并没有那么好,是吗!?

提前致谢

【问题讨论】:

  • 我的意思是在可读性方面并没有那么好,是吗!?实际上是这样,因为第一个示例使用了额外的代码行
  • 投票重新开放。它在某种程度上确实取决于意见,但有充分的理由更喜欢第二个版本,如@ThiefMaster 的回答所示。
  • 谢谢,很高兴听到我在第一篇文章中并没有真正违反规则 :-)

标签: python for-loop coding-style


【解决方案1】:

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

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

【讨论】:

  • 谢谢,尤其是你的最后一段对我来说是一个很好的理由,因为否则我总是不得不使用不同的版本,这会适得其反且不规则。我认为总是使用相同的东西会更好,更清洁:-)
  • 当您想要重复访问其索引处的列表/可迭代项目时,枚举会更快。当您只需要索引列表时,使用 len() 和 range(Python 2.x 中的 xrange)会更快。
猜你喜欢
  • 2012-12-05
  • 2018-02-06
  • 2014-10-28
  • 2019-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-06
相关资源
最近更新 更多