Abschnitt 4 · Lektion 2
for und range
„Mach das siebenmal“ braucht mit while drei Zeilen an drei Stellen. Den Anfang davor, die
Bedingung oben und den Schritt im Block. Wiederholen kann while alles. Für den häufigsten Fall ist
das aber viel Aufwand, nämlich für eine feste Zahl von Runden oder für „einmal für jeden Tag der
Woche“, und an jeder der drei Stellen kann etwas schiefgehen. Dafür gibt es eine zweite Schleife.
Eine Woche, Tag für Tag
for tag in range(1, 8):
print("Tag", tag) for tag in range(1, 8): liest man „für jeden Tag aus range(1, 8)“. range liefert eine Folge von
Zahlen, hier 1 bis 7, und for geht sie durch. In jeder Runde legt es die nächste Zahl in tag und
lässt dann den Block laufen. Wenn die Zahlen aufgebraucht sind, ist die Schleife fertig.
Anfang, Bedingung und Schritt stehen damit alle in einer Zeile, und den Schritt macht for selbst.
Vergessen kannst du ihn also nicht. Eine Endlosschleife gibt es mit range auch nicht, irgendwann
sind die Zahlen alle. Den Namen nach dem for wählst du selbst, und er bekommt in jeder Runde einen
neuen Wert. Doppelpunkt und eingerückter Block funktionieren wie bei if und while.
Was range liefert
for i in range(5):
print("Runde", i) Mit nur einer Zahl fängt range bei 0 an. range(5) liefert 0, 1, 2, 3 und 4, also fünf Zahlen.
Die 5 ist nicht dabei. Warum beim Programmieren so oft ab null gezählt wird, wird in Abschnitt 5 bei
den Listen klar. Bis dahin ist die Zahl in der Klammer einfach die Anzahl der Runden.
Wenn der Zähler nichts weiter bedeutet als „die wievielte Runde“, heißt er oft einfach i. Das ist
eine alte Gewohnheit, und i gehört zu den wenigen Namen, die auch in deutschem Code niemand
übersetzt. Sobald die Zahl etwas bedeutet, einen Tag, eine Menge oder einen Monat, bekommt sie einen
Namen, der das sagt.
Mit zwei Zahlen gibt man den Anfang selbst an. range(1, 8) fängt bei 1 an und hört vor der 8
auf. Der Anfang gehört also dazu, das Ende nicht. Daran hängt bei range alles. Wie viele Zahlen es
sind, ist deshalb einfach Ende minus Anfang, hier 8 minus 1 gleich 7. Eine dritte Zahl wäre die
Schrittweite. range(0, 100, 10) zählt in Zehnerschritten.
Der Fehler um eins
for tag in range(1, 7):
print("Tag", tag) Wenn du sieben Tage willst und an „1 bis 7“ denkst, schreibst du schnell range(1, 7). Dann hat die
Woche sechs Tage. Eine Fehlermeldung gibt es nicht, denn für Python ist eine Woche mit sechs Tagen
kein Problem. Auf Englisch heißt dieser Fehler „off by one“, um eins daneben, und er passiert in
jeder Sprache.
In der Aufzeichnung im Reiter Debug wechseln sich die Zeile mit dem for und das print ab. Am
Rand steht der neue Wert von tag, 1, 2, 3, bis 6. Danach kommt nur noch einmal die Zeile mit dem
for, und dann ist Schluss. Die 7 erreicht tag nie. So findet man den Fehler auch, wenn er nicht
so offen daliegt wie hier. Man schaut nach, bei welchem Wert die Schleife wirklich aufhört.
Für „1 bis n“ schreibt man deshalb range(1, n + 1). Für eine Woche also range(1, 8), auch wenn
die 8 seltsam aussieht.
Eine Zahl reicht nicht
for tag in 7:
print("Tag", tag) for tag in 7: ist als „siebenmal“ gemeint, und Python bricht ab mit
TypeError: 'int' object is not iterable. „Iterable“ heißt etwa „durchgehbar“, also etwas, das sich
Stück für Stück durchgehen lässt. Eine einzelne Zahl ist das nicht, range(7) schon. Ein Text
übrigens auch, Zeichen für Zeichen. Darum geht es in der nächsten Lektion.
for oder while
Dieselbe Woche ginge auch mit while, also mit tag = 1 davor, while tag <= 7: als Bedingung und
tag += 1 im Block. Das Ergebnis wäre genau gleich. Nur stünden Anfang, Bedingung und Schritt
wieder an drei Stellen, und jede davon kann danebenliegen. Damit ist die Wahl ziemlich einfach:
- Steht vor der Schleife fest, wie viele Runden es werden, oder geht man eine Folge durch, die es
schon gibt, nimmt man
for. - Hängt das Ende davon ab, was in der Schleife passiert, wie beim Sparziel oder beim Raten einer
Zahl, nimmt man
while.
Was die Aufgabe will
Bei der Preistabelle hängt die Zahl der Runden an einer Eingabe. Damit kommt es auf beide Enden von
range an. Geprüft wird, ob die Tabelle wirklich bei 1 anfängt und genau bei der eingegebenen Zahl
aufhört.
Zum Mitnehmen
for geht eine Folge von Werten durch, einen nach dem anderen. range liefert dafür Zahlen, vom Anfang bis kurz vor dem Ende. Wer vorher weiß, wie oft, nimmt for.
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 4 Beispielen zum Ausprobieren
Steht hier, ohne Konto lesbar.
-
Aufgabe, dein Code läuft auf einem Server
Öffnet sich mit dem Basis Konto.