Why does range(start, end) not include end?

后端 未结 9 1186
夕颜
夕颜 2020-11-22 10:24
>>> range(1,11)

gives you

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

Why not 1-11?

Did they just decide to do it lik

相关标签:
9条回答
  • 2020-11-22 11:13

    The length of the range is the top value minus the bottom value.

    It's very similar to something like:

    for (var i = 1; i < 11; i++) {
        //i goes from 1 to 10 in here
    }
    

    in a C-style language.

    Also like Ruby's range:

    1...11 #this is a range from 1 to 10
    

    However, Ruby recognises that many times you'll want to include the terminal value and offers the alternative syntax:

    1..10 #this is also a range from 1 to 10
    
    0 讨论(0)
  • 2020-11-22 11:17

    Consider the code

    for i in range(10):
        print "You'll see this 10 times", i
    

    The idea is that you get a list of length y-x, which you can (as you see above) iterate over.

    Read up on the python docs for range - they consider for-loop iteration the primary usecase.

    0 讨论(0)
  • 2020-11-22 11:18

    It works well in combination with zero-based indexing and len(). For example, if you have 10 items in a list x, they are numbered 0-9. range(len(x)) gives you 0-9.

    Of course, people will tell you it's more Pythonic to do for item in x or for index, item in enumerate(x) rather than for i in range(len(x)).

    Slicing works that way too: foo[1:4] is items 1-3 of foo (keeping in mind that item 1 is actually the second item due to the zero-based indexing). For consistency, they should both work the same way.

    I think of it as: "the first number you want, followed by the first number you don't want." If you want 1-10, the first number you don't want is 11, so it's range(1, 11).

    If it becomes cumbersome in a particular application, it's easy enough to write a little helper function that adds 1 to the ending index and calls range().

    0 讨论(0)
提交回复
热议问题