The idea of range is easy to grasp: make a regular sequence of numbers. Each number in the sequence is some constant larger or smaller than the previous number. Examples of desired sequences are

(0,1,2,3,4,5,6,7,8,9,10,11,12)
(-10,-6,-2,2,6,10,14,18)
(205,204,203,202,201,200,199)

The parameters of range are straightforward: range(start,end,increment). The official documentation might show the parameters differently, which seems confusing initially:

range([start],stop,[step])

The confusing thing is the addition of square brackets. In official documents of Python, square brackets surrounding a parameter indicate that it can be omitted. Thus,

range(stop)
range(start,stop)
range(start,stop,step)

are the three valid ways to use range. The thinking behind this convention is that, based on experience of programmers, the most frequent range usage is to get a sequence [0,1,2 ... p] for some positive number p. In fact, most often one sees something like range(len(A)) where A is some sequence or dictionary:

1
2
3
>>> R = [267,'j',0,1.57,33,-9]
>>> range(len(R))
[0, 1, 2, 3, 4, 5]

The example just produces a list of numbers so that each can be used to index the sequence R. It is not so convenient to get the same sequence backwards:

1
2
3
>>> R = [267,'j',0,1.57,33,-9]
>>> range(len(R)-1,-1,-1)
[5, 4, 3, 2, 1, 0]

Somewhat more often, programs need a sequence of numbers going through part of a full range, for instance

1
2
3
>>> R = [267,'j',0,1.57,33,-9]
>>> range(3,len(R))
[3, 4, 5]

(showing that the default step value is 1).

So, to remember the parameters of range, learn what ways of using range happen most frequently in software: range(m) for getting the numbers 0 through m-1, range(k,m) for getting numbers k through m-1, and the least frequent case with all parameters,

1
2
>>> range(31,100,10)
[31, 41, 51, 61, 71, 81, 91]
(notice that the stop parameter is never in the sequence of numbers produced by range).