range() are quite similar in terms of functionality. They both generate a sequence of integers, with the only difference that
range() returns a Python list, whereas,
xrange() returns an xrange object.
So how does that make a difference? It sure does, because unlike
xrange() doesn't generate a static list, it creates the value on the go. This technique is commonly used with an object type generators and has been termed as "yielding".
Yielding is crucial in applications where memory is a constraint. Creating a static list as in
range() can lead to a Memory Error in such conditions, while,
xrange() can handle it optimally by using just enough memory for the generator (significantly less in comparison).
for i in xrange(10): # numbers from o to 9
print i # output => 0 1 2 3 4 5 6 7 8 9
for i in xrange(1,10): # numbers from 1 to 9
print i # output => 1 2 3 4 5 6 7 8 9
for i in xrange(1, 10, 2): # skip by two for next
print i # output => 1 3 5 7 9
xrange has been deprecated as of
Python 3.x. Now range does exactly the same what xrange used to do in
Python 2.x, since it was way better to use
xrange() than the original
range() function in