The range function returns a list of numbers between the two arguments (or one) you pass it.
For example, range(2) would return -> [0, 1]
range(0, 2) would return -> [0, 1] also
The xrange function is the same but returns an object. The benefit in this is much less memory used.
For example, xrange(2) would return -> xrange object
list(xrange(2)) would return -> [0, 1]
If you use both in a for loop, the result would be the same, except xrange would use less memory.
I would not worry about arange, it is used in numpy and returns an array instead of a list. It is pretty much a range function.