Iterators
In typical design pattern parlance, an iterator is an object with a next() method and a done() method; the latter returns True if there are no items left in the sequence. In a programming language without built-in support for iterators, the iterator would be used like this:
while not iterator.done(): 
    item = iterator.next() 
    # do something with the item 
    In Python, iteration is available across many language features, so the method gets a special name, __next__. This method can be accessed using the next(iterator) built-in. Rather than a done() method, Python's iterator protocol raises the StopIteration exception to notify the client that the iterator has completed. Finally, we have the much more readable for item in iterator: syntax to actually access items in an iterator instead of messing around with a while statement. Let's look at each these in more detail.