Abschnitt 4 · Lektion 5
Schleifen in Schleifen
Ein kleines Kino hat drei Reihen, A bis C, mit je vier Plätzen. An der Kasse braucht man eine Liste aller Plätze. Eine Schleife über die Plätze 1 bis 4 ist schnell geschrieben, aber dann hat man nur eine Reihe. Man könnte sie dreimal untereinander schreiben, einmal je Reihe. Nur sollten Schleifen eigentlich genau diese Sorte Wiederholung abschaffen.
Eine Schleife im Block einer anderen
for reihe in "ABC":
for platz in range(1, 5):
print("Reihe", reihe, "Platz", platz) Hier steht eine for-Schleife im Block einer anderen. Die äußere geht die Reihen durch. Weil
"ABC" ein Text ist, holt sie sich wie beim Zählen der e ein Zeichen nach dem anderen, erst A, dann
B, dann C. Die innere geht die Plätze durch. Ihr Block ist doppelt eingerückt, weil er zu beiden
Schleifen gehört.
Die innere Schleife läuft in jeder Runde der äußeren einmal komplett durch. Erst wenn sie mit Platz 4 fertig ist, ist die äußere Runde vorbei. Dann fängt die nächste mit der nächsten Reihe an, und die innere Schleife beginnt wieder bei Platz 1. Deshalb stehen zuerst alle Plätze der Reihe A da, dann alle der Reihe B und dann die der Reihe C.
Das print läuft also zwölfmal, vier Plätze in jeder von drei Reihen. Bei verschachtelten Schleifen
multipliziert sich das, und bei größeren Zahlen merkt man es. Tausend Runden außen mal tausend innen
sind schon eine Million.
Wer gerade wo steht
Im Reiter Debug sieht man besonders gut, wie das abläuft. Wenn du in der Aufzeichnung einen
Schritt aus der inneren Schleife auswählst, stehen darunter beide Namen, reihe und platz, mit
ihrem Wert in diesem Moment. Die Zeilen der inneren Schleife wechseln sich ab, und am Rand zählt
platz von 1 bis 4. Danach kommt einmal die Zeile mit dem äußeren for. reihe wird zu 'B', und
platz fängt wieder bei 1 an.
Die einfachen Anführungszeichen um das B sind übrigens Absicht. So schreibt Python Text, wenn es
zeigt, was in einem Namen steht. Daran unterscheidest du im Reiter den Text '1' von der Zahl 1.
Mehrere Ausgaben in einer Zeile
for reihe in "ABC":
for platz in range(1, 5):
print(f"{reihe}{platz}", end=" ")
print() Zwölf Zeilen untereinander sind als Sitzplan unpraktisch. Schöner wäre eine Zeile je Reihe, mit den
Plätzen nebeneinander. Bisher hängt print an jede Ausgabe einen Zeilenumbruch, und bisher war das
auch richtig so.
Mit end=" " in der Klammer hängt print stattdessen ein Leerzeichen an, und die nächste Ausgabe
landet in derselben Zeile. end ist ein benanntes Argument, also eins, das print von sich aus
kennt. Wie das funktioniert, kommt in Abschnitt 8. Mit end="" hängt print gar nichts an.
Fehlt noch der Umbruch am Ende jeder Reihe. Dafür steht ein print() ohne alles da, die leere Zeile
aus Lektion 1.2. Es steht im Block der äußeren Schleife und hinter der inneren. Also läuft es einmal
je Reihe, nachdem alle Plätze dieser Reihe dastehen. Heraus kommt ein Sitzplan mit drei Zeilen.
Eine Einrückung entscheidet
for reihe in "ABC":
for platz in range(1, 5):
print(f"{reihe}{platz}", end=" ")
print() Wo dieses print() steht, hängt allein an seiner Einrückung. Hier steht es ganz links, also nach
beiden Schleifen. Es läuft genau einmal, ganz am Ende, und der ganze Sitzplan landet in einer
einzigen langen Zeile. Rückt man es so weit ein wie das andere print, gehört es zur inneren
Schleife und macht nach jedem einzelnen Platz einen Umbruch. Dann steht alles wieder untereinander.
Drei Einrückungen, drei verschiedene Programme, und keins davon meldet einen Fehler. Zu welchem Block eine Zeile gehört und wie oft sie läuft, steht bei verschachtelten Schleifen allein an der linken Kante.
Ein break gehört übrigens auch nur zu einer Schleife, nämlich zu der, in deren Block es steht. In
der inneren beendet es nur die innere. Die äußere macht mit ihrer nächsten Runde weiter.
Was die Aufgabe will
Das Einmaleins als Tafel ist ein Klassiker mit Zahlen. Eine Zeile je Zahl, und die Ergebnisse stehen sauber in Spalten untereinander. Wie groß die Tafel wird, fragt das Programm.
Zum Mitnehmen
Eine Schleife darf im Block einer anderen stehen. Die innere läuft dann in jeder Runde der äußeren einmal komplett durch, und wie oft ihr Block insgesamt läuft, ist ein Produkt: drei Reihen mal vier Plätze sind zwölf.
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 3 Beispielen zum Ausprobieren
Steht hier, ohne Konto lesbar.
-
Aufgabe, dein Code läuft auf einem Server
Öffnet sich mit dem Basis Konto.