python range 函数不接受序列参数有什么充分的理由吗?

Pau*_*zer -1 python loops design-patterns numpy

正如标题所说,我想知道为什么range其单参数形式的内置函数不接受序列作为其参数。我只能看到积极的一面,所以我想知道我是否错过了一些明显的东西。

  • 考虑到我和我确信许多其他人range(somelist)在他们的range(len(somelist))意思应该是显而易见的时候打字的频率
  • 我看不出有任何其他方式可以解释它
  • 它将消除冗余和一级括号嵌套,并在换行对可读性特别有害的位置节省打字和行宽
  • 我看不出它破坏了任何代码

所以我的问题是(请不要仅仅发表意见)

  • 有没有我可能错过的好的(客观的,Python Zen是可以接受的)论点?
  • 也许已经有一个方便的功能了range(len(x))

可选(如果有人碰巧知道)

  • Python 开发人员考虑过这一点吗?BDFL 的立场是什么?
  • 为什么numpy中没有arange_likeor ?indices_like(或者有吗?)

编辑:我本来希望这没有必要,但显然是错误的。range所以我澄清一下:这根本不是善恶的问题。为了争论起见,让我们接受它是语言的一部分并从那里获取一些东西。

MSe*_*ert 5

因为您可以迭代序列而无需range

a = [1,2,3,4]
for item in a:
    print(item)
1
2
3
4
Run Code Online (Sandbox Code Playgroud)

如果您还需要索引,请使用enumerate

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

0 1
1 2
2 3
3 4
Run Code Online (Sandbox Code Playgroud)

如果您想组合两个或多个序列,请使用zipor itertools.zip_longest

for item1, item2 in zip(a, a[::-1]):
    print(item1, item2)

1 4
2 3
3 2
4 1
Run Code Online (Sandbox Code Playgroud)

因此,实际上(几乎)没有理由range(len(a))这样做,为什么为此添加快捷方式会有用呢?

根据 Python Zen:

美丽总比丑陋好。

显式的比隐式的好。

  • + 表示“枚举”。如果您需要与可迭代匹配的索引,那么这是标准构造。`numpy` 有 `ndenumerate`。 (2认同)