@Back2basic: Der Iterator kann intern so etwas wie ein Zeiger in eine Folge von existierenden Datensätzen sein (muss er aber nicht!). Aber das ist nicht das `i` in einer ``for``-Schleife. Das `i` wird an die Elemente gebunden, die der Iterator liefert wenn `next()` auf dem Iterator aufgerufen wird. Iteratoren sind die Objekte die das entsprechende Protokoll implementieren, also mit `next()` das jeweils nächste Element liefern oder eine `StopIteration`-Ausnahme auslösen falls es kein nächstes Element gibt.
Hinter dem ``in`` einer ``for``-Schleife muss ein iterierbares Objekt stehen, also eines, das wenn man es an die `iter()`-Funktion übergibt, einen Iterator liefert. Der wird intern für jeden Schleifendurchlauf nach dem nächsten Element gefragt, und das wird an den oder die Namen zwischen ``for`` und ``in`` gebunden. Die folgende ``for``-Schleife müsste man durch die danach folgende ``while``-Schleife ersetzen, wenn es ``for`` in Python nicht gäbe:
Code: Alles auswählen
for item in iterable:
do_somethint(item)
# ->
iterator = iter(iterable)
while True:
try:
item = iterator.next()
except StopIteration:
break
else:
do_something(item)
Wobei man auf den Iterator einer ``for``-Schleife normalerweise keinen direkten Zugriff hat. Wenn man das möchte, muss man den Iterator *vor* der ``for``-Schleife selber erstellen und ihn als `iterable` nach dem ``in`` angeben. Den Iteratoren sind selbst iterierbar. Die Sprachbeschreibung gibt an, dass ein Iterator bei ``iter(iterator)`` unverändert zurück gegeben wird.