Un iterable è qualsiasi cosa su cui puoi fare un loop (una lista, stringa, dict); un iterator è l'oggetto che esegue l'iterazione vera e propria, producendo valori uno alla volta e tracciando la sua posizione. Questa distinzione è alla base di come funzionano i loop for in Python.
I due protocolli
Iterable → has __iter__() → returns an iterator
Iterator → has __next__() → returns the next value (and __iter__ returning itself)
