range is a class of immutable iterable objects. Their iteration behavior can be compared to lists: you can’t call next directly on them; you have to get an iterator by using iter.
So no, range is not a generator.
You may be thinking, “why didn’t they make it an iterator”? Well, ranges have some useful properties that wouldn’t be possible that way:
- They are immutable, so they can be used as dictionary keys.
- They have the
start,stopandstepattributes (since Python 3.3),countandindexmethods and they supportin,lenand__getitem__operations. - You can iterate over the same
rangemultiple times.
>>> myrange = range(1, 21, 2)
>>> myrange.start
1
>>> myrange.step
2
>>> myrange.index(17)
8
>>> myrange.index(18)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: 18 is not in range
>>> it = iter(myrange)
>>> it
<range_iterator object at 0x7f504a9be960>
>>> next(it)
1
>>> next(it)
3
>>> next(it)
5