0%

Iteration als Schnittstelle · Übung

iter() und next() verwenden

Eine for-Schleife ist eine Erleichterung. Darunter stecken zwei Funktionsaufrufe, die du selbst ausführen kannst. Wenn du das einmal tust, verschwindet ein großer Teil des Geheimnisses.

Eine Schleife von Hand steuern

Try it

iter() fordert den Iterator an. next() fordert ein Element an und bewegt ihn weiter. Das ist das gesamte Protokoll auf der Seite des aufrufenden Codes.

Frage noch einmal, und der Iterator muss etwas mitteilen:

next(walker)

StopIteration. Kein Fehler in deinem Code, sondern die Meldung eines Iterators, dass nichts mehr übrig ist. Die Ausnahme ist die Nachricht.

Was for tut

Mit diesen beiden Aufrufen kannst du die Schleife ausführlich hinschreiben:

Try it

Dieselbe Ausgabe wie bei for question in questions. Jede for-Schleife, die du je geschrieben hast, entspricht diesem Ablauf. Deshalb reicht eine for-Schleife StopIteration nie an dich weiter: Die Ausnahme abzufangen und aufzuhören ist ihre Aufgabe.

Was tut eine for-Schleife mit StopIteration?

Ein Standardwert statt einer Ausnahme

next() akzeptiert ein zweites Argument, das bei einem beendeten Iterator zurückgegeben wird, statt eine Ausnahme auszulösen:

Try it

Das ist nützlich, weil „Nimm das nächste Element, falls eines existiert“ damit von vier Zeilen auf eine schrumpft. Es passt, wenn das Ende ein gewöhnliches Ergebnis ist. Es passt nicht, wenn das Ende ein Problem bedeutet, von dem du erfahren möchtest.

Wofür du das tatsächlich brauchst

Meistens solltest du for schreiben. Diese Lektion spricht nicht dagegen. Der direkte Griff zu iter() und next() lohnt sich in einigen konkreten Fällen:

Ein Element nehmen und den Rest durchlaufen. Die erste Dateizeile ist eine Überschrift, die übrigen sind Daten:

lines = iter(all_lines)
header = next(lines)

for line in lines:
    ...

Die for-Schleife setzt an der Position fort, die next() hinterlassen hat. Es gibt einen Iterator, den beide teilen. Das funktioniert wegen der Trennung aus Lektion 1.

Ein Element sicher nehmen. next(walker, None) beantwortet „Gibt es etwas?“ und liefert zugleich dieses Element. Der Iterator bewegt sich weiter. Das ist ein Lesen mit Verbrauch, kein bloßer Blick auf das nächste Element.

Zwei Folgen in unterschiedlichem Tempo durchlaufen. Wenn zip() nicht passt, weil eine Seite manchmal zwei Schritte macht.

Schreibst du while True mit einem try um next(), hast du for nachgebaut. Schreibe dann for.

Aufgabe

Verwende iter() und next() direkt für drei Aufgaben, bei denen sie ihren Platz verdienen.

split_header(lines) gibt die erste Zeile und eine Liste des Rests zurück. Nimm ein Element mit next() und durchlaufe danach für den Rest denselben Iterator. Eine leere Eingabe ergibt (None, []).

first_or(items, fallback) gibt das erste Element zurück oder fallback, wenn keines existiert. Verwende die Form von next() mit zwei Argumenten statt eines try.

count_by_hand(items) zählt die Elemente mit while True, next() und except StopIteration statt einer for-Schleife. In echtem Code würdest du das nicht schreiben. Es einmal selbst umzusetzen nimmt der Schleife aber ihre Magie.

Führe das Programm aus und prüfe, ob split_header die übrigen zwei Zeilen zurückgibt, nicht alle drei.