Iterators
- Anything that can be done with generators can also be done with class-based iterators.
- What makes generators so compact is that the
__iter__()
and __next__()
methods are created automatically.
Overview
- When we write
for
loop, it internally calls iter()
on the container object.
- The
iter()
function returns an iterator
object.
- The
iterator
object has a __next__()
method that returns the next item in the container.
- The
__next__()
method is called repeatedly until it raises StopIteration
exception, which tells the for
loop to stop iterating.
>>> s = 'abc'
>>> it = iter(s)
>>> it
<str_iterator object at 0x10c90e650>
>>> next(it)
'a'
>>> next(it)
'b'
>>> next(it)
'c'
>>> next(it)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
next(it)
StopIteration
Code
class Reverse:
"""Iterator for looping over a sequence backwards."""
def __init__(self, data):
self.data = data
self.index = len(data)
def __iter__(self):
return self
def __next__(self):
if self.index <= 0:
raise StopIteration
self.index = self.index - 1
return self.data[self.index]
rev = Reverse('abcdef')
for c in rev:
print(c)