python函数有什么理由不接受序列参数?

2024-04-24 07:21:35 发布

您现在位置:Python中文网/ 问答频道 /正文

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

  • 考虑到我和我确信很多其他人在他们的意思是range(len(somelist))时输入range(somelist),其含义应该是显而易见的
  • 我看不出任何其他的解释方式
  • 它将删除冗余和一级括号嵌套,并在换行符对可读性特别有害的位置保存键入和行宽度
  • 我看不出它会破坏任何密码

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

  • 有没有什么好的(客观的,PythonZen是可接受的)论点,我可能会错过这些论点?在
  • 是否已经有一个方便函数range(len(x))?在

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

  • Python开发人员是否考虑过这一点?如果有的话,BDFL的立场是什么?在
  • 为什么numpy中没有arange_like或{}?(或者有没有?)在

编辑:我本希望这不是必要的,但显然是错误的。所以请让我澄清一下:这根本不是一个关于range是善还是恶的问题。为了争论,让我们接受它是语言的一部分,并从中吸取教训。


Tags: 函数标题参数len方式range序列内置
3条回答
  • Considering how often I and I'm sure many others have typed range(somelist) when they meant range(len(somelist)) the meaning should be obvious

实际上,这种情况只会“经常”发生在新的Python用户身上。但迟早你应该学会不那样做。使用索引循环很容易因一个错误而关闭。正确的python方法是for item in somelist,如@MSeifert的答案所示。在

  • It would remove redundancy and one level of parenthesis nesting and save typing and line width in a location where linebreaks are especially harmful to readability

我个人认为这不是一个有力的论据。在传统的C/C++符号中,我们总是做{{CD2}}。这是括号嵌套的一个级别,人们对此很满意。所以Python的len(somelist)同样正常。{cd4>显然需要一个整数来表示。考虑到这个设计契约,用整数以外的任何东西调用range(…)很可能是一个bug。因此,静默地将输入转换为一个整数会使这个错误在早期阶段更难被注意到。(注:我也被其他语言的类似演员给咬了一口,但这不是话题。)

  • I couldn't see it breaking any code
  • I fail to see any other ways it could be interpreted in

由于标准范围(…)已经设计为不接受列表,所以是的,您可以始终重写它以添加范围(somelist)行为,而不破坏现有代码。这是你的选择。在

So my question is (please refrain from merely venting opinions)

  • Are there any good (objective, Python Zen is acceptable) arguments against which I may have missed?

另外,您知道range(...)也接受多个输入参数吗?range(stop)range(start, stop)range(start, stop, step)。我不喜欢range(1, 10, 2)和{}都是有效的但却意味着不同的观点。在

  • Is there perhaps already a convenience function for range(len(x))?

可能没有。但话说回来,你不应该经常需要这个。我发现自己只有在写一些关于算法练习的“学术代码”时才会这样做。在

定义一个接受列表输入的函数很简单:

def lrange(alist):
    return range(len(alist))

如果像这样的实用程序函数使代码清晰,请使用它。时间成本可以忽略不计。在

numpy甚至比核心Python更多的是有很多小函数,它们只是根据一个或多个用户组的习惯来优化输入。在

因为您可以不使用range对序列进行迭代:

a = [1,2,3,4]
for item in a:
    print(item)
1
2
3
4

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

^{pr2}$

如果要组合两个或更多序列,请使用zip或{}:

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

1 4
2 3
3 2
4 1

所以实际上(几乎)从来没有理由去做range(len(a)),那么为什么要为此添加一个快捷方式呢?在

根据Python Zen:

Beautiful is better than ugly.

Explicit is better than implicit.

相关问题 更多 >