Between Iterators and Iterables – How and Why?

Python provides two different but related protocols called an iterator and iterable. The Python Practice Book provides a good explanation, including complete examples. I highly recommend reading it and then coming back here. For the sake of completeness, I will layout the basics here as well.

Iterable – Definition

Any object that enables us to loop (or iterate) over it, by providing an iterator (directly or indirectly; more on that later). In other words, such that can be used in a for-each semantics: for item in iterable: ...
Python standard collections are iterables (list, dict, set), file objects can also be used as iterables, and many more.

An iterable needs to comply with one of the following:

  1. Directly – implement an __iter__ method that returns an iterator (that comply to the protocol below).
  2. Indirectly – implement a __getitem__ method to return the item in a given index (or IndexError exception when the location is invalid. This method can be used to create a generic iterator.

You can get an iterable by using:

  1. Use built-in iterables, like list, dict, set and more.
  2. Create a class that complies with the protocol.
  3. Use a generator method.
  4. Some built-in or library methods will return an iterable object (e.g. xrange)

Iterator – Definition

An iterator is usually created from an iterable object (by invoking iter(it)).
Usually it isn’t the same instance, but another one the has a reference to its parent. It is used to iterate, or loop, over the iterable that provided it.
An iterator is an object that complies with the following interface:

  • Every iterator is an iterable – so it needs to comply with the iterable protocol (implement __iter__ method, that usually returns itself).
  • Implement a next method that return the next element or raise a StopIteration exception.

You can get an iterator by:

  • Invoking iter(iterable) for any iterable.
  • Create a class that complies with the protocol. Checkout zrange example here.
  • Different libraries provides iterators, such as itertools.

WIP

This post is work-in-progress.
I intend to add more content soon, but for now, enjoy the overview.

Leave a Reply