Abschnitt 5 · Lektion 3
Durch eine Liste laufen
Für eine Woche geht es noch, jeden Eintrag einzeln über seine Position zu holen. Für einen Kontoauszug mit zweihundert Buchungen nicht, auch wenn alle Werte unter einem Namen liegen, und meistens will man ohnehin mit jedem Eintrag dasselbe tun. Ausgeben, aufsummieren, prüfen. Die Schleife dafür kennst du schon.
Jeder Eintrag einmal
einkauf = ["Brot", "Milch", "Eier"]
for sache in einkauf:
print("-", sache)
print("Fertig.") for sache in einkauf: funktioniert genau wie for zeichen in text, nur mit Einträgen statt
Zeichen. In jeder Runde liegt der nächste Eintrag in sache, vom ersten bis zum letzten. Nach dem
letzten ist die Schleife vorbei. Wie viele Runden es werden, musst du nicht wissen. Es sind so
viele, wie die Liste lang ist. Bei einer leeren Liste sind es null Runden, und das Programm macht
nach der Schleife einfach weiter.
Den Namen nach dem for wählst du selbst. Üblich ist die Einzahl der Liste, for preis in preise,
for name in namen. Dann liest sich die Zeile fast wie ein Satz.
Im Reiter Debug siehst du beide Namen nebeneinander. einkauf hat die ganze Liste und ändert
sich nie. In sache steht der Eintrag der Runde, erst 'Brot', dann 'Milch', dann 'Eier'.
Zählen, summieren, das Größte finden
Die drei Muster aus Abschnitt 4 funktionieren mit Listen unverändert. for preis in preise: und
darin summe += preis ist die Summe über eine ganze Preisliste. Vor der Schleife anlegen, in der
Schleife verändern, nach der Schleife ausgeben. Anders ist nur, woher die Werte kommen. Statt in
jeder Runde ein input() zu lesen, holt sich die Schleife den nächsten Eintrag aus der Liste.
Für eine Summe geht es in der nächsten Lektion noch kürzer. Das Muster bleibt trotzdem nützlich, sobald die Frage komplizierter wird als „wie viel zusammen“. Etwa „wie viel zusammen, aber nur für Lebensmittel“.
Mit Nummer
einkauf = ["Brot", "Milch", "Eier"]
for i in range(len(einkauf)):
print(f"{i + 1}. {einkauf[i]}") Manchmal brauchst du in der Schleife nicht nur den Eintrag, sondern auch seine Nummer, zum Beispiel
für eine nummerierte Liste. Der erste Gedanke ist oft der Weg über die Positionen.
range(len(einkauf)) liefert 0, 1 und 2, also genau die Positionen der Liste, und einkauf[i] holt
den Eintrag dazu. Das ist der Zusammenhang, den Lektion 5.1 versprochen hat. range(n) und die
Positionen einer Liste mit n Einträgen sind dieselben Zahlen.
Es funktioniert. Aber es gibt zwei Stellen, an denen man sich um eins verzählen kann, die Nummer mit
i + 1 und den Eintrag mit einkauf[i]. Und es liest sich nicht wie das, was gemeint ist.
einkauf = ["Brot", "Milch", "Eier"]
for nummer, sache in enumerate(einkauf):
print(nummer, sache) enumerate (durchnummerieren) kommt ohne Positionen aus. Es liefert in jeder Runde zwei Werte auf
einmal, die Nummer und den Eintrag, und for nummer, sache in verteilt sie auf zwei Namen. Ohne
weitere Angabe fängt die Nummer bei 0 an, wie die Positionen. Mit start=1 als zweiter Angabe in
den Klammern fängt sie bei 1 an, so wie Menschen zählen.
Dass for zwei Namen auf einmal belegen kann, ist neu. Woher das kommt, erklärt die Lektion über
Tupel. Bis dahin reicht es, bei einer Schleife, die Paare liefert, zwei Namen mit einem Komma
dazwischen zu schreiben.
Zwei Listen im Gleichschritt
artikel = ["Brot", "Milch", "Eier"]
preise = [2.49, 1.19, 3.29]
for name, preis in zip(artikel, preise):
print(f"{name:<10}{preis:>8.2f}") Manchmal stehen zwei Dinge, die zusammengehören, in zwei Listen, etwa Artikel und Preise. Dann nimmt
zip beide im Gleichschritt (zip wie Reißverschluss). In jeder Runde kommt aus jeder Liste der
nächste Eintrag, der erste Artikel mit dem ersten Preis, der zweite mit dem zweiten. Wieder verteilt
for die beiden auf zwei Namen. Mit festen Spaltenbreiten wird daraus schon fast ein Kassenbon.
artikel = ["Brot", "Milch", "Eier", "Kaffee"]
preise = [2.49, 1.19, 3.29]
for name, preis in zip(artikel, preise):
print(f"{name:<10}{preis:>8.2f}")
print(len(artikel), "Artikel,", len(preise), "Preise") Einen Haken hat zip, und der ist leise. Sind die Listen verschieden lang, hört es auf, sobald die
kürzere zu Ende ist. Im Beispiel hat der Kaffee keinen Preis bekommen, und er taucht in der Ausgabe
einfach nicht auf. Keine Meldung, kein Fehler, nur eine Zeile weniger. Erst die letzte Zeile verrät
es: vier Artikel, drei Preise.
Besser ist es deshalb, Dinge, die zusammengehören, gar nicht erst auf zwei Listen zu verteilen. Wie das geht, zeigt Lektion 5.7.
Was die Aufgabe will
Gefragt ist eine nummerierte Liste mit dem, was heute ansteht. Die Einträge kommen ab hier aus einer Datei, so wie Daten im Alltag meistens ankommen. Zwei Zeilen im Startcode lesen sie als Liste ein, und wie das im Einzelnen geht, zeigt Abschnitt 11. Was fehlt, ist die Ausgabe mit Nummern ab 1. Und ein Satz für den Tag, an dem gar nichts ansteht.
Zum Mitnehmen
for geht eine Liste Eintrag für Eintrag durch, so wie vorher einen Text. enumerate zählt dabei mit, zip nimmt zwei Listen im Gleichschritt. Eine Position braucht man dafür fast nie.
Jetzt du
Basis Konto, kostenlosZu dieser Lektion gehört eine Aufgabe. Du schreibst den Code selbst, und nach jedem Lauf sagt dir eine Prüfliste, was schon stimmt.
Dafür brauchst du das Basis Konto. Es kostet nichts, und ein Passwort gibt es auch nicht.
In diesem Kurs läuft dein Code auf einem Server. Dafür hat das Basis Konto 1 Stunde im Monat, mehr Zeit gibt es mit dem Premium Konto.
Was in dieser Lektion steckt
-
Artikel mit 5 Beispielen zum Ausprobieren
Steht hier, ohne Konto lesbar.
-
Aufgabe, dein Code läuft auf einem Server
Öffnet sich mit dem Basis Konto.