Concept Flow - Iterator protocol
Create iterable object
Call iter() to get iterator
Call next() on iterator
Yield next item if available
StopIteration raised when done
End
The iterator protocol means an object can be looped over by calling iter() to get an iterator, then repeatedly calling next() until no items remain.