我注意到,当我尝试这样做时,我得到完全相同的结果,例如:
range(1,13,2)
=> [1, 3, 5, 7, 9, 11]
和
range(1,12,2)
=> [1, 3, 5, 7, 9, 11]
结果完全相同,但在这种情况下哪一个是正确的?为什么?
范围的结束是否必须对您采取的步骤采取措施?
就像,列表应该给我11作为最后一个数字的想法,所以我 应该拿13,因为我们有2步,或者这是一个糟糕的想法?
答案 0 :(得分:1)
两者都是正确的。范围是从开始间隔开始的数字序列,并且严格地小于停止。由于该定义,您将始终找到步骤可能的值,以便停止给出完全相同的序列(特殊情况:当步骤具有默认值1时,仅存在一个停止的值)
答案 1 :(得分:0)
range(start,end,step)
范围功能将为您提供从"开始"开始的数字。直到它到达" end-1",但是每个号码与下一个号码的距离为#34;步骤"。
对于你的第一个案例你的结局是13-1 = 12,所以你可以得到的最终值是12.但是因为你的步数是2,所以得到11(1,3,5,7,9),加2并得到13,它无法进入。
对于你的第二种情况,你的结局是12-1 = 11。它增加2直到达到11(1,3,5,7,9)并停在那里。
对于你应该使用哪一个,你真的没有正确的答案,因为它取决于你使用的范围。我猜你的案例2的计算量会略微减少,因为它不需要添加最后一步,但这很小。
答案 2 :(得分:0)
根据documentation,如果step
严格为正,则范围中的最大元素将是start + i * step
小于stop
的最大元素。
这意味着最大的元素是:
start + ((stop - start - 1)//step) * step
由于整数除法,range(1,13,2)
和range(1,12,2)
(11)的结果相同:
>>> 11 // 2
5
>>> 10 // 2
5
为避免任何意外,您可以始终将max + 1
用作stop
。就你的例子而言,那就是range(1,12,2)
。