>>> range(1,11)
给你
[1,2,3,4,5,6,7,8,9,10]
为什么不是1-11?
他们是随机决定这样做的,还是有一些我没有看到的价值?
>>> range(1,11)
给你
[1,2,3,4,5,6,7,8,9,10]
为什么不是1-11?
他们是随机决定这样做的,还是有一些我没有看到的价值?
当前回答
因为调用range(0,10)更常见,它返回[0,1,2,3,4,5,6,7,8,9],其中包含10个元素,等于len(range(0,10))。记住,程序员更喜欢基于0的索引。
另外,考虑下面的公共代码片段:
for i in range(len(li)):
pass
你能看出如果range()恰好上升到len(li),这将是有问题的吗?程序员需要显式地减去1。这也符合程序员喜欢for(int i = 0;I < 10;i++) over for(int I = 0;I <= 9;我+ +)。
如果你频繁调用起始值为1的range,你可能需要定义自己的函数:
>>> def range1(start, end):
... return range(start, end+1)
...
>>> range1(1, 10)
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
其他回答
它与基于零的索引和len()结合使用效果很好。例如,如果列表x中有10个项目,它们的编号为0-9。Range (len(x))给出0-9。
当然,人们会告诉你,对于item in x或者index, item in enumerate(x)而不是i in range(len(x))更符合python规则。
切片也是这样工作的:foo[1:4]是foo的第1-3项(请记住,由于从零开始的索引,第1项实际上是第二项)。为了保持一致性,它们应该以相同的方式工作。
我认为它是:“你想要的第一个数字,后面跟着你不想要的第一个数字。”如果你想要1-10,你不想要的第一个数字是11,所以它的范围是(1,11)。
如果在特定的应用程序中它变得很麻烦,那么很容易编写一个小的帮助函数,向结束索引添加1并调用range()。
专属范围确实有一些好处:
首先,对于长度为n的列表,范围(0,n)中的每个项都是有效的索引。
同样,range(0,n)的长度为n,而不是包含range的长度为n+1。
它对于分割范围也很有用;Range (a,b)可以分为Range (a, x)和Range (x, b),而包含Range则可以写成x-1或x+1。虽然您很少需要分割范围,但您确实倾向于经常分割列表,这是切片列表l[a:b]包括第a个元素而不包括第b个元素的原因之一。那么range具有相同的属性会使它很好地一致。
范围的长度是上值减去下值。
它非常类似于:
for (var i = 1; i < 11; i++) {
//i goes from 1 to 10 in here
}
c风格的语言。
也像Ruby的范围:
1...11 #this is a range from 1 to 10
然而,Ruby意识到很多时候你想要包含终端值,并提供了另一种语法:
1..10 #this is also a range from 1 to 10
python中的范围(n)返回从0到n-1。分别为(1,n)从1到n-1。 所以,如果你想省略第一个值,同时得到最后一个值(n),你可以使用下面的代码简单地做到这一点。
for i in range(1, n + 1):
print(i) #prints from 1 to n