Now we have all the tools to appreciate how we can write our own custom iterator. Let's first define an iterable and an iterator:
- Iterable: An object is said to be iterable if it's capable of returning its members one at a time. Lists, tuples, strings, and dictionaries are all iterables. Custom objects that define either of the __iter__ or __getitem__ methods are also iterables.
- Iterator: An object is said to be an iterator if it represents a stream of data. A custom iterator is required to provide an implementation for __iter__ that returns the object itself, and an implementation for __next__ that returns the next item of the data stream until the stream is exhausted, at which point all successive calls to __next__ simply raise the StopIteration exception. Built-in functions, such as iter and next, are mapped to call __iter__ and __next__...