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 list
s: 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 directly iterable"? Well, range
s 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
,stop
andstep
attributes (since Python 3.3),count
andindex
methods and they supportin
,len
and__getitem__
operations. - You can iterate over the same
range
multiple times.
>>> myrange = range(1, 21, 2)>>> myrange.start1>>> myrange.step2>>> 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