Why is the range object "not an iterator"? [duplicate] Why is the range object "not an iterator"? [duplicate] python-3.x python-3.x

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).