正如标题所说,我想知道为什么range
内置于其一个参数形式中并不接受序列作为其参数。我只能看到积极的一面,所以我想知道我是否遗漏了一些明显的东西。
range(somelist)
意味着range(len(somelist))
的意思应该是显而易见的时候输入的次数所以我的问题是(请不要仅仅发表意见)
range(len(x))
可能已经有了便利功能吗?可选(如果有人碰巧知道)
arange_like
或indices_like
? (或者有吗?) 编辑:我原本希望这不是必要的,但显然是错的。所以,请让我澄清一下:这完全不是range
是善还是恶的问题。让我们只是为了论证而接受它是语言的一部分并从那里拿东西。
答案 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
如果您想要合并两个或更多个序列,请使用zip
或itertools.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还有很多很少的功能,只需改进输入以适应一组或多组用户的习惯。