Why is the range object "not an iterator"? [duplicate]
The range object is iterable. However, it's not an iterator.
To get an iterator, you need to call iter()
first:
>>> r=range(5,15)>>> next(iter(r))5>>> next(iter(r))5>>> next(iter(r))5>>> next(iter(r))5>>> i=iter(r)>>> next(i)5>>> next(i)6>>> next(i)7>>> next(i)8>>> iter(r)<range_iterator object at 0x10b0f0630>>>> iter(r)<range_iterator object at 0x10b0f0750>>>> iter(r)<range_iterator object at 0x10b0f0c30>
Edit: But be careful not to call iter()
with every call to next()
. It creates a new iterator at index 0.
range
returns an iterable, not an iterator. It can make iterators when iteration is necessary. It is not a generator.
A generator expression evaluates to an iterator (and hence an iterable as well).
The next
builtin calls the __next__
hook method. So, range
objects have a well defined __iter__
, but not a well-defined __next__
.
iterable objects have __iter__
defined, iterator objects have well defined __next__
(typically with an __iter__
method which simply returns self
).