Python-Kurs / Mit for, range, enumerate und zip Daten durchlaufen

Eine for-Schleife verarbeitet nacheinander Elemente eines iterierbaren Objekts. Verwenden Sie die Werte direkt, wenn diese ausreichen, enumerate für zusätzliche Zähler und zip für zusammengehörige Werte aus mehreren Folgen.

Werte direkt durchlaufen und Zahlenbereiche beschreiben

Python beschränkt for nicht auf das manuelle Hochzählen eines Listenindex. Sie können unmittelbar die Werte einer Liste oder die Elemente einer Zeichenkette durchlaufen. Das vermeidet einen zusätzlichen Index, wenn Sie ohnehin nur den jeweiligen Wert benötigen.

range(start, stop, step) beschreibt eine Zahlenfolge, deren Endwert stop ausgeschlossen ist. Ein negativer Schritt zählt abwärts. Speichern Sie dieses vollständige kleine Beispiel als range_demo.py und starten Sie python range_demo.py mit dem Projektinterpreter:

for value in range(1, 4):
    print(value)

Es erscheinen 1, 2 und 3 in getrennten Zeilen. Die 4 wird nicht ausgegeben. range ist keine vorab erzeugte Liste aller Werte; es beschreibt die Folge speichersparend. Wenn Sie alle Werte zum Anzeigen mit list(range(...)) materialisieren, entsteht dagegen tatsächlich eine Liste. Die Referenz zu range beschreibt Grenzen und Schritte.

Namen und Beträge mit Anzeigenummern verbinden

Speichern Sie den vollständigen Code als for_loop.py in UTF-8 im Übungsordner. Führen Sie python for_loop.py im ausgewählten Projektinterpreter aus; unter macOS oder Ubuntu kann außerhalb einer aktivierten Umgebung python3 der passende Befehl sein. Zusatzpakete und Eingabedateien sind nicht erforderlich.

names = ["coffee", "lunch", "bus"]
amounts = [3500, 8000, 2500]
for number, (name, amount) in enumerate(zip(names, amounts, strict=True), start=1):
    print(number, name, amount)
print(list(range(5, 0, -2)))

Erwartete Ausgabe:

1 coffee 3500
2 lunch 8000
3 bus 2500
[5, 3, 1]

zip verbindet jeweils einen Namen mit einem Betrag. enumerate fügt jedem solchen Paar einen Zähler hinzu. Das Muster number, (name, amount) entpackt zuerst Zähler und Paar und danach die zwei Bestandteile des Paars. Die Übung zum Entpacken von Sequenzen erklärt die Anzahl der Zielwerte.

start=1 beginnt die Anzeigenummer bei eins. Die tatsächlichen Indizes von names und amounts ändern sich nicht: Der erste Listeneintrag steht weiterhin an Position null. Nutzen Sie die bereits entpackten Werte, statt den Zähler versehentlich als unveränderten Listenindex zu verwenden. Die Referenz zu enumerate beschreibt den Startwert.

Die letzte Ausgabe stellt den absteigenden Bereich dar: Mit Start 5 und Schritt -2 entstehen 5, 3 und 1. Der Endwert null ist ausgeschlossen.

Gleiche Längen prüfen und Iteratoren nicht mehrfach voraussetzen

Ohne weitere Option endet zip, sobald die kürzeste Eingabe endet. Das kann Daten unbemerkt auslassen. Wenn Namen und Beträge gleich viele Einträge haben müssen, macht strict=True eine Abweichung mit ValueError sichtbar. Die Option ist ab Python 3.10 verfügbar; der Kurs verwendet Python 3.12 oder neuer. Die Referenz zu zip beschreibt beide Verhaltensweisen.

Die Längenabweichung wird beim Durchlaufen erkannt. Schon vorher gebildete Paare können verarbeitet oder ausgegeben worden sein. Das vollständige Beispiel kann deshalb zwei Zeilen drucken, bevor die dritte Paarbildung scheitert. strict=True ist keine Transaktion und macht vorangegangene Ausgaben oder Schreibvorgänge nicht rückgängig. Wenn Teilverarbeitung unzulässig ist, prüfen Sie bei solchen Listen die Form vorab oder planen Sie einen getrennten Validierungsschritt.

zip liefert einen Iterator: Wenn Sie dasselbe Iteratorobjekt einmal vollständig durchlaufen, sind dessen Werte verbraucht. Um erneut zu verarbeiten, erzeugen Sie es neu aus geeigneten Quellen oder halten Sie das benötigte Ergebnis bewusst fest. Eine Liste als Quelle ist erneut durchlaufbar, der bereits verbrauchte zip-Iterator nicht.

Viele parallele Listen können auseinanderlaufen oder ihre Beziehungen unklar machen. Bei umfangreicheren Datensätzen ist oft eine Liste von Dictionaries sinnvoller, bei der Name und Betrag im selben Datensatz stehen. Die Wahl sollte Ihre Datenbeziehungen ausdrücken, nicht nur die Schleife verkürzen.

Grenzen, fehlende Werte und Änderungen testen

  1. Entfernen Sie nur den letzten Betrag 2500. Mit strict=True sollen zunächst die beiden vollständigen Paare ausgegeben werden, dann folgt ValueError. Die abschließende range-Ausgabe wird in diesem Programm nicht mehr erreicht.
  2. Entfernen Sie bei diesen verkürzten Daten zusätzlich die Option strict=True samt vorangehendem Komma. Nun endet die Paarverarbeitung nach zwei Zeilen ohne Längenfehler; der Bereich [5, 3, 1] wird wieder ausgegeben.
  3. Stellen Sie beide Listen und die Option wieder her. Vergleichen Sie die vier ursprünglichen Ausgabezeilen.
  4. Ändern Sie nur den letzten Bereich zu range(5, -1, -2). Das Ergebnis bleibt 5, 3 und 1, denn auch -1 ist als Endwert ausgeschlossen. Erst ein weiter entfernter Stopp wie -2 lässt -1 als Folgenelement zu. Stellen Sie danach den Originalbereich wieder her.

Ein leerer iterierbarer Wert führt zu null Schleifendurchläufen. Ein Name, der ausschließlich im Schleifenrumpf gesetzt wird, erhält bei leerer Eingabe keinen neuen Wert. Initialisieren Sie ein Ergebnis vor der Schleife oder behandeln Sie leere Daten ausdrücklich, wenn Sie den Wert anschließend benötigen.

Entfernen Sie während einer Schleife nicht unbedacht Elemente aus derselben Quellliste. Durch verschobene Positionen können Einträge ausgelassen werden. Sammeln Sie Änderungen separat oder erzeugen Sie eine gefilterte Ergebnisliste; die Listenübung zu Änderungen und Kopien zeigt diesen Unterschied. Trennen Sie das Lesen einer Folge von Änderungen an ihrer Struktur.