If range() is a generator in Python 3.3, why can I not call next() on a range?

If range() is a generator in Python 3.3, why can I not call next() on a range?

range is a class of immutable iterable objects. Their iteration behavior can be compared to lists: you cant 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 didnt they make it directly iterable? Well, ranges have some useful properties that wouldnt be possible that way:

  • They are immutable, so they can be used as dictionary keys.
  • They have the start, stop and step attributes (since Python 3.3), count and index methods and they support in, len and __getitem__ operations.
  • You can iterate over the same range multiple 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

If range() is a generator in Python 3.3, why can I not call next() on a range?

Leave a Reply

Your email address will not be published.