mitmario.dev

for und range

Python Sandbox 4 Min Lesezeit 4 BeispieleLektion 2 von 7

„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

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

Fünf Runden ab null
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

Eine Woche mit sechs Tagen
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

Eine Zahl statt range
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, kostenlos

Zu 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.