python范围函数是否有任何理由不接受序列参数?

时间:2017-02-06 21:43:19

标签: python loops numpy design-patterns

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

  • 考虑到我和我确定许多其他人在range(somelist)意味着range(len(somelist))的意思应该是显而易见的时候输入的次数
  • 我没有看到任何其他方式可以在
  • 中解释
  • 它会删除冗余和一级括号嵌套,并在换行符对可读性特别有害的位置保存输入和行宽
  • 我无法看到它破坏任何代码

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

  • 我可能错过了哪些好的(客观的,Python Zen是可接受的)论据?
  • range(len(x))可能已经有了便利功能吗?

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

  • 这是Python开发人员考虑过的吗?如果是BDFL的职位怎么办?
  • 为什么numpy中没有arange_likeindices_like? (或者有吗?)

编辑:我原本希望这不是必要的,但显然是错的。所以,请让我澄清一下:这完全不是range是善还是恶的问题。让我们只是为了论证而接受它是语言的一部分并从那里拿东西。

3 个答案:

答案 0 :(得分:4)

因为您可以在没有range的情况下迭代序列:

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

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

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

0 1
1 2
2 3
3 4

如果您想要合并两个或更多个序列,请使用zipitertools.zip_longest

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

1 4
2 3
3 2
4 1

所以实际上(几乎)没有理由做range(len(a))那么为什么为它添加快捷方式会有用呢?

根据Python Zen:

  

美丽胜过丑陋。

     

明确比隐含更好。

答案 1 :(得分:2)

  
      
  • 考虑到我和我确定许多其他人在指定范围(len(somelist))时输入范围(某些列表)的频率应该是显而易见的
  •   

实际上只会发生"经常"对于新的Python用户。但迟早(并且比以后更好)你应该学会不要那样做。使用索引循环容易受到一个错误的影响。正确的和pythonic方式是for item in somelist,如@MSeifert的回答所示。

  
      
  • 它会删除冗余和一级括号嵌套,并在换行符对可读性特别有害的位置保存输入和行宽
  •   

我个人认为这不是一个有力的论据。在传统的C / C ++表示法中,我们始终for(int i=0; i<strlen(aString); i++) {...}。这是括号嵌套的一个层次,人们对此很好。所以Python的len(somelist)同样正常。我认为重点是,在语义上,range(length)需要一个整数N作为输入来清楚地表达&#34;我想要一个N轮迭代&#34;。根据这个设计契约,使用除整数之外的任何东西调用范围(...)很可能是一个错误。因此,将输入静默地转换为整数会使这个bug在早期阶段更难被注意到。 (PS:我被其他语言的类似演员所咬,但这不是主题。)

  
      
  • 我无法看到它破坏任何代码
  •   
  • 我没有看到任何其他方式可以在
  • 中解释   

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

  

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

     
      
  • 我可能错过了哪些好的(客观的,Python Zen是可接受的)论据?
  •   

作为旁注,您知道range(...)也接受多个输入参数吗? range(stop)range(start, stop)range(start, stop, step)。我不喜欢range(1, 10, 2)range([1, 10, 2])既有效也有意思不同的观点。

  
      
  • 是否已经有范围的便利功能(len(x))?
  •   

可能不是。但话说回来,你不应该经常这样做。当我写一些&#34;学术代码&#34;时,我发现自己只做了range(len(somelist))。算法练习。

答案 2 :(得分:1)

定义一个获取该列表输入的函数是微不足道的:

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

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

numpy甚至比核心Python还有很多很少的功能,只需改进输入以适应一组或多组用户的习惯。