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
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
stepattributes (since Python 3.3),
indexmethods and they support
- You can iterate over the same
>>> 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