【问题标题】:Why is "for i in range(len(arr))" considered un-Pythonic?为什么“for i in range(len(arr))”被认为是非 Pythonic?
【发布时间】:2020-08-19 17:25:32
【问题描述】:

编辑:我想澄清一下,我在这里询问的是明确需要索引的情况。我知道for item in items 在不需要时会更好。我长期习惯将列表项视为my_list[i]arr[i]。我发现列表的名称和彼此相邻的索引非常清晰和有帮助。所以我的问题是,改变我对索引和价值的看法以适应enumerate 的工作方式是否有任何优势。

正如标题所说。我读过很多回答说for i in range(len(arr)) 不好,但没有听到关于为什么会出现这种情况的充分理由。一个论点是它是“非 Pythonic”,但与 c 风格的版本相比,它表面上看起来很 Pythonic。

由于enumerate 有一个有时不需要的附加参数,我对它的优势感到困惑,因为似乎不能保证增加简单性。我想了解更多关于为什么我应该避免使用for i in range(len(arr)),或者这实际上是否只是个人喜好。

【问题讨论】:

  • 因为你很少需要它。您希望多久只是项的索引?通常,您要么想要项目,在这种情况下for item in items:,或者您(但不仅)需要索引,在这种情况下for index, item in enumerate(items):。跨度>
  • 我也想知道这一点。 @jonrsharpe,我同意如果您使用索引来访问循环内的数组,那么 enumerate 是一个更好的选择。但是在你只需要索引的情况下,它仍然是“坏的”吗?

标签: python for-loop range enumerate


【解决方案1】:

直接遍历列表更简单。

for x in some_list:
    print(x)

for i in range(len(some_list)):
    print(some_list[i])

如果您确实需要索引,可以使用enumerate(即使您不关心该索引的值,尽管这种用例很少见):

indices_of_positive = [i for i, x in enumerate(some_list) if x > 0]

indices_of_positive = [i for i in range(len(some_list)) if some_list[i] > 0]

请注意,enumerate 不需要 iterable 来支持长度协议。

【讨论】:

  • 我已编辑问题以排除 for item in items 适合的情况,因为这对我来说很清楚。到目前为止,我已经“枚举不需要迭代来支持长度协议”。作为一个可能的优势。还有吗?
  • 更直接。当使用索引的唯一原因是获取列表中的一个项目,而您可以通过迭代直接获取项目时,为什么要迭代索引?
猜你喜欢
  • 2020-11-04
  • 2020-02-16
  • 2017-10-21
  • 1970-01-01
  • 2018-02-11
  • 1970-01-01
  • 1970-01-01
  • 2022-06-16
  • 2021-05-03
相关资源
最近更新 更多