Un iterable es cualquier cosa sobre la que puedes iterar (una lista, una cadena, un dict); un iterador es el objeto que realiza la iteración propiamente dicha, produciendo valores uno a uno y rastreando su posición. Esta distinción sustenta el funcionamiento de los bucles for en Python.
Los dos protocolos
Iterable → has __iter__() → returns an iterator
Iterator → has __next__() → returns the next value (and __iter__ returning itself)
