Ein iterable ist alles, über das du iterieren kannst (eine Liste, einen String, ein Dict); ein iterator ist das Objekt, das die eigentliche Iteration durchführt, Werte nacheinander erzeugt und seine Position verfolgt. Diese Unterscheidung liegt der Funktionsweise von for-Schleifen in Python zugrunde.
Die zwei Protokolle
Iterable → has __iter__() → returns an iterator
Iterator → has __next__() → returns the next value (and __iter__ returning itself)
