# Range function

The range function in Python generates a sequence of integers. It's most frequently used in for-loops, to define the values the iterator variable should take on.

## Basics

The format for the range function is

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

Range will return an iterator whose values are start, start+step, start+2*step, ... up to but not including stop. The start and step parameters are optional, if not specified start defaults to 0 and step defaults to 1.

If the specified parameters makes the range impossible (for example, if stop is smaller than start, but step is positive), then range will return an empty iterator.

Note that the sequence range returns is different from the other sequence types. It's much more efficient, especially for large ranges, to generate the elements on the fly than to generate them all beforehand and store them in memory. If you need a real list for some reason you can call the type conversion function list on the range as shown below:

```range(5)       # returns an iterator that generates the numbers 0,1,2,3,4
list(range(5)) # returns the list [0,1,2,3,4]
```

## Examples

```Function Call      Output      Remarks
---------------------------------------
range(5)           0,1,2,3,4   Remember, endpoints aren't included!
range(3,8)         3,4,5,6,7
range(3,8,2)       3,5,7
range(4,-1,-1)     4,3,2,1,0
range(0,-5)        none        This range is impossible, because end<start
```

## Common Usage

The simplest use of range is in a for loop, iterating through a list. For example, the following will add 1 to each element of myList:

```for i in range(len(myList)):
myList[i] += 1
```

If we wanted to traverse the list in reverse order, we could use:

```for i in range(len(myList)-1, -1, -1):
myList[i] += 1
```

Note that the range is only computed once in a for loop. Hence, if the length of your list is going to change during the loop (if you're removing elements, say) you shouldn't use a range based on the length of the list, because you'll either get an error when you try to go past the end of the list or stop short. Instead, you can use either

```for x in myList:
if x%2 == 0: # remove all the even elements
myList.remove(x)
```

or, if you still need the index, you can use a while loop where you manually increment and test an index variable:

```i = 0
while i<len(myList):
if myList[i]%2 == 0: # remove all the even elements
del(myList[i])
i += 1 # don't forget to increment i, or you'll have an infinite loop!
```