>>> range(1,11)

给你

[1,2,3,4,5,6,7,8,9,10]

为什么不是1-11?

他们是随机决定这样做的,还是有一些我没有看到的价值?


当前回答

它与基于零的索引和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()。

其他回答

基本上在python range(n)中迭代n次,这是排他的性质,这就是为什么它在打印时不给出最后一个值,我们可以创建一个函数,给出 包含值,这意味着它还将打印范围中最后提到的值。

def main():
    for i in inclusive_range(25):
        print(i, sep=" ")


def inclusive_range(*args):
    numargs = len(args)
    if numargs == 0:
        raise TypeError("you need to write at least a value")
    elif numargs == 1:
        stop = args[0]
        start = 0
        step = 1
    elif numargs == 2:
        (start, stop) = args
        step = 1
    elif numargs == 3:
        (start, stop, step) = args
    else:
        raise TypeError("Inclusive range was expected at most 3 arguments,got {}".format(numargs))
    i = start
    while i <= stop:
        yield i
        i += step


if __name__ == "__main__":
    main()

专属范围确实有一些好处:

首先,对于长度为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具有相同的属性会使它很好地一致。

只是在很多情况下更方便推理。

基本上,我们可以把范围看作起点和终点之间的间隔。如果start <= end,则它们之间的间隔长度为end - start。如果len实际上被定义为长度,你会得到:

len(range(start, end)) == start - end

但是,我们计算范围中包含的整数,而不是测量间隔的长度。为了保持上述性质为真,我们应该包括其中一个端点并排除另一个端点。

添加step参数就像引入一个长度单位。在这种情况下,你会期望

len(range(start, end, step)) == (start - end) / step

的长度。要得到计数,只需使用整数除法。

它与基于零的索引和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()。