Entscheidungen treffen — if, elif, else
Je nach Bedingung unterschiedliche Wege gehen, warum die Einrückung in Python Bedeutung hat und der stille Fehler, der entsteht, wenn Bedingungen in der falschen Reihenfolge stehen.
Wie möchtest du lernen?
Das Problem, das wir lösen
Im letzten Kapitel haben wir gelernt, Fragen zu stellen — ist age >= 18 wahr oder falsch? Aber das Programm kannte die Antwort und machte nichts damit; es gab nur True oder False aus.
Jetzt ist es Zeit, auf diese Antwort zu reagieren. Ein Weg, wenn die Bedingung zutrifft, ein anderer, wenn nicht. Hier hört Code auf, eine Liste von Schritten zu sein, und fängt an, Entscheidungen zu treffen.
Und hier unterscheidet sich Python von vielen anderen Programmiersprachen: Welche Zeilen zu einer Bedingung gehören und welche nicht, wird durch die Einrückung bestimmt. Es gibt keine geschweiften Klammern {}. Am Anfang wirkt das ungewohnt, und dann gewöhnt man sich daran — denn Code, der ordentlich aussieht, ist auch ordentlich aufgebaut.
Am Ende dieses Kapitels kannst du
- Code mit
ifnur unter einer Bedingung ausführen - Mit
elseeine Alternative angeben und mitelifmehrere - Richtig einrücken sowie einen
IndentationErrorlesen und beheben - Erklären, warum die Reihenfolge der Bedingungen wichtig ist — die größte Falle hier
- Eine Bedingung in eine andere verschachteln und erkennen, wann man das besser vermeidet
Voraussetzungen: True und False — Fragen an dein Programm stellen.
Die einfachste Form
age = 22
if age >= 18:
print("You may enter")
print("Program finished")You may enter
Program finishedDer Aufbau hat drei Teile:
- Das Wort
if, danach eine Bedingung - Ein Doppelpunkt
:am Ende der Bedingung — ihn zu vergessen ist der häufigste Fehler - Die folgenden Zeilen, um vier Leerzeichen eingerückt — genau diese eingerückten Zeilen werden von der Bedingung gesteuert
Wäre age 15 gewesen, dann hätte das erste print nicht stattgefunden, das letzte aber schon — weil es außerhalb der Bedingung steht.
Die Einrückung bestimmt die Bedeutung
Diese beiden Programme sehen fast gleich aus und verhalten sich komplett unterschiedlich:
score = 30
if score >= 50:
print("Passed")
print("Certificate issued")Führst du das aus, erscheint nichts im Terminal — beide Zeilen liegen innerhalb der Bedingung, und die Bedingung ist falsch.
score = 30
if score >= 50:
print("Passed")
print("Certificate issued")Certificate issuedDie zweite print-Zeile steht jetzt außerhalb der Bedingung, also läuft sie immer — und einer Person, die durchgefallen ist, wurde gerade ein Zertifikat ausgestellt. Eine falsch eingerückte Zeile verletzt die Geschäftsregel, und Python meldet keinen Fehler, weil beide Versionen gültiger Code sind.
Vier Leerzeichen, keine Tabs. Python akzeptiert beides, aber wenn man beides in einer Datei mischt, gibt es einen TabError, und der ist mühsam zu finden, weil Tabs und Leerzeichen auf dem Bildschirm gleich aussehen. In VS Code, das du in Kapitel 1 installiert hast, fügt die Tab-Taste in einer Python-Datei vier Leerzeichen ein — das ist die Standardeinstellung, und vier Leerzeichen sind Pythons offizielle Konvention.else — der andere Weg
age = 15
if age >= 18:
print("You may enter")
else:
print("Sorry, adults only")Sorry, adults onlyelse hat keine eigene Bedingung, denn die steht schon fest: „wenn keine der obigen Bedingungen zutraf“. Von if und else läuft genau einer; nie beide, nie keiner.
elif — mehrere Wege
marks = 72
if marks >= 80:
grade = "A"
elif marks >= 70:
grade = "B"
elif marks >= 60:
grade = "C"
elif marks >= 40:
grade = "D"
else:
grade = "F"
print(f"Marks {marks} gives grade {grade}")Marks 72 gives grade Belif bedeutet „sonst, wenn“. Was passiert: Python arbeitet die Kette von oben nach unten ab, führt den Block der ersten Bedingung aus, die wahr ist, und verlässt dann die ganze Kette. Die übrigen prüft es nicht einmal.
Bei marks = 72: 72 >= 80 ist falsch, 72 >= 70 ist wahr → grade = "B", fertig. 72 >= 60 und 72 >= 40 sind ebenfalls wahr, werden aber nie angeschaut.
Und hier ist die größte Falle
Weil elif bei der ersten wahren Bedingung stoppt, führt eine falsche Reihenfolge zu einem Programm, das läuft, keinen Fehler meldet und trotzdem falsch antwortet:
marks = 95
if marks >= 40:
grade = "Pass"
elif marks >= 80:
grade = "Excellent"
else:
grade = "Fail"
print(grade)Pass95 Punkte, aber kein Excellent. Denn 95 >= 40 war sofort wahr, und Python hat dort aufgehört — die zweite Bedingung wurde gar nicht geprüft.
Die Regel dazu: Die strengste, spezifischste Bedingung kommt zuerst, die lockerste zuletzt. Bei Notenbereichen geht man am besten von oben nach unten, vom größten Wert aus, wie im Notenbeispiel oben.
Dieser Fehler ist so unauffällig, dass man ihn nur findet, wenn man gezielt nachsieht. Deshalb: Gewöhne dir an, nach dem Schreiben einer Bedingungskette das Programm einmal für jeden Zweig mit einem Wert laufen zu lassen. Der Notencode von oben sollte für 95, 72, 65, 45 und 20 fünf verschiedene Antworten liefern. Stimmen zwei überein, ist die Reihenfolge falsch.
Eine Bedingung in einer Bedingung
is_logged_in = True
is_admin = False
if is_logged_in:
if is_admin:
print("Welcome, admin")
else:
print("Welcome, user")
else:
print("Please log in")Welcome, userDas innere if ist um vier Leerzeichen eingerückt, weil es unter dem äußeren steht, und seine eigenen print-Zeilen sind um acht eingerückt. Das funktioniert, aber je mehr Ebenen es gibt, desto schwerer ist der Code zu lesen. Oft sagt and dasselbe klarer:
is_logged_in = True
is_admin = False
if is_logged_in and is_admin:
print("Welcome, admin")
elif is_logged_in:
print("Welcome, user")
else:
print("Please log in")Welcome, userWelche Variante besser ist, hängt davon ab, was sich leichter lesen lässt. Wenn du mehr als drei Ebenen tief verschachtelt bist, halte an und denk neu nach — fast immer ist das ein Zeichen, dass sich die Bedingungen anders anordnen lassen.
Eingaben prüfen
Jetzt haben wir das Werkzeug für das Problem, das wir in einem früheren Kapitel offen gelassen haben — was passiert, wenn jemand nichts oder ein Wort eingibt:
raw = input("Your age: ").strip()
if raw == "":
print("You did not type anything")
elif raw.isdigit():
age = int(raw)
if age >= 18:
print(f"Age {age}: you may enter")
else:
print(f"Age {age}: adults only")
else:
print(f"'{raw}' is not a whole number")Your age: twenty
'twenty' is not a whole numberisdigit() ist eine neue Methode — sie prüft, ob jedes Zeichen im Text eine Ziffer ist. Das ist der einfache Weg, vorab zu prüfen, bevor man etwas an int() übergibt, und so tritt der ValueError gar nicht erst auf. (isdigit() akzeptiert keine negativen Zahlen und keine Dezimalzahlen — dafür braucht man try, das kommt später.)
Ein vollständiges Beispiel
fare.py:
# Work out a ticket fare from age and day of week
age = int(input("Passenger age : "))
day = input("Day of week : ").strip().lower()
base_fare = 120.0
# Most specific rule first, loosest last
if age < 5:
fare = 0.0
category = "Infant"
elif age < 18:
fare = base_fare * 0.5
category = "Child"
elif age >= 60:
fare = base_fare * 0.7
category = "Senior"
else:
fare = base_fare
category = "Adult"
is_weekend = day == "saturday" or day == "sunday"
if is_weekend:
fare = fare * 1.2
print()
print(f"Category : {category}")
print(f"Weekend : {is_weekend}")
print(f"Fare : {fare:.2f}")Passenger age : 65
Day of week : Sunday
Category : Senior
Weekend : True
Fare : 100.80Beachte zwei Entwurfsentscheidungen. Erstens sind die Altersbedingungen mit elif verkettet, weil ein Fahrgast genau in eine Kategorie fällt. Zweitens ist die Wochenendbedingung ein eigenes if, weil es eine unabhängige Frage ist — egal wie alt jemand ist, kommt der Wochenendzuschlag obendrauf. Zu entscheiden, was ein elif ist und was ein eigenes if, ist die eigentliche Arbeit beim Schreiben von Bedingungen.
Wenn etwas schiefgeht
SyntaxError: expected ':' Der Doppelpunkt am Ende der if-, elif- oder else-Zeile fehlt.
IndentationError: expected an indented block after 'if' statement Die Zeile nach dem if ist nicht eingerückt. Eine Bedingung braucht mindestens eine Zeile darin.
IndentationError: unexpected indent Irgendeine Zeile ist ohne Grund eingerückt. Überlege, zu welchem Block diese Zeile eigentlich gehören soll.
TabError: inconsistent use of tabs and spaces in indentation In einer Datei sind Tabs und Leerzeichen gemischt. Wähle in deinem Editor „Einrückung in Leerzeichen umwandeln“.
SyntaxError — ein elif oder else, das allein steht elif und else gehören immer zu einem if und müssen auf derselben Einrückungsebene stehen wie dieses if.
TypeError: '>=' not supported between instances of 'str' and 'int' Du hast vergessen, den input() umzuwandeln. Schreibe int(input(...)).
Die Bedingungen sehen richtig aus, nehmen aber den falschen Weg Prüfe die Reihenfolge. Steht eine lockere Bedingung vorn, wird die strenge nie geprüft. Führe das Programm einmal mit einem Wert für jeden Zweig aus.
Schritt 4 von 6 — Vorhersagen
Prüfe dein Verständnis
Was gibt dieses Programm mit 85 Punkten aus?
marks = 85
if marks >= 40:
print("Pass")
elif marks >= 80:
print("Excellent")
else:
print("Fail")- AExcellent Pass
- BPass
- CPass Excellent
- DExcellent
Was gibt dieses Programm aus?
score = 30
if score >= 50:
print("Passed")
print("Done")- APassed Done
- BDone
- CGar nichts
- DPassed
Auch wenn die Person 25 eintippt, bricht das mit einem TypeError ab. Was ist die Ursache, und was ist die Lösung?
age = input("Age: ")
if age >= 18:
print("Adult")
else:
print("Minor")- A`input()` liefert Text, und Text lässt sich nicht mit einer Zahl vergleichen — es braucht `age = int(input("Age: "))`
- BVor einem `else` ist ein `elif` erforderlich
- C`>=` darf nicht in einer `if`-Bedingung stehen; es muss `>` sein
- D`age` ist ein reserviertes Wort, deshalb ist der Vergleich fehlgeschlagen
Zum Antworten brauchst du ein Konto
Melde dich an, um deine Antworten zu prüfen
Die Fragen stehen oben, und sie im Kopf durchzuarbeiten ist der wichtige Teil. Melde dich an, um die Antworten, die Erklärungen und die dreistufigen Hinweise zu sehen.
Jetzt bist du dran
Schreibe eine Datei namens bmi.py, die eine Körpergröße in Metern und ein Gewicht in Kilogramm entgegennimmt, den BMI berechnet und die Kategorie ausgibt.
Die Formel: bmi = weight / (height * height)
Die Kategorien:
- Unter 18,5 — Untergewicht
- 18,5 oder mehr, aber unter 25 — Normalgewicht
- 25 oder mehr, aber unter 30 — Übergewicht
- 30 oder mehr — Adipositas
Die Grenzen sind mit „unter“ (<) und „oder mehr“ (>=) absichtlich so formuliert. Schreibt man „18,5 bis 24,9“, entsteht eine Lücke in der Mitte — ein BMI wie 24,95 würde dann in keine Kategorie fallen. Mit < und >= fällt jede Zahl in genau eine Kategorie.
Vier Anforderungen:
- Zeig den BMI mit einer Nachkommastelle an
- Ordne die Bedingungen so, dass alle vier Kategorien wirklich funktionieren
- Wenn die Größe
0ist, halte an, bevor du dividierst, und gib eine Meldung aus — sonst bekommst du einenZeroDivisionError - Führe es mit vier Werten aus, die alle vier Kategorien abdecken, und außerdem mit Werten direkt an den Grenzen — in welche Kategorie fällt ein BMI von genau 25? (Es sollte Übergewicht sein.)
Die vierte Anforderung ist die wichtigste: Werte direkt auf einer Grenze decken Fehler bei der Reihenfolge der Bedingungen auf.
In dieser Mission steckt noch mehr
Was du oben gelesen hast, ist die vollständige Mission – nichts wurde herausgekürzt. Pro ergänzt:
- Was wirklich unter der Haube passiert – wie Python das ausführt
- Die vollständige Lösung der Übung, Schritt für Schritt erklärt
- Schwierigere Zusatzübungen
- Die Interviewfrage zu diesem Thema, mit Musterantwort
Schritt 6 von 6
Herausforderung — das Kapitel-Quiz
Zehn Fragen von leicht bis schwer. Die letzten sind absichtlich knifflig.
Melde dich an, um das Quiz zu machen