Bedingungen und boolesche Logik in Python
and, or und not und verwendest if, elif und else, damit in jeder Situation der passende Code ausgeführt wird. Danach verschachtelst du Entscheidungen, nutzt die Wahrheitswertauswertung (Truthiness) von Werten, testest jeden Zweig mit gut gewählten Eingaben und wählst mit der match-Anweisung zwischen Fällen.AnfängerEinheit 2 von 10 in Kurs: Python-Programmierung – Schleifen, Funktionen, Listen und Dateien
Was du lernst
- Schreibe Vergleiche mit den sechs Vergleichsoperatoren von Python, sage für Zahlen und Texte voraus, ob sie
TrueoderFalseergeben, und vermeide die Verwechslungen, durch die eine Bedingung unbemerkt falsch wird.- Zahlen mit den sechs Vergleichsoperatoren vergleichenVerwende
==,!=,<,<=,>und>=, um Zahlen zu vergleichen, lies jedes Ergebnis als booleschen Wert und unterscheide den Vergleich von der Zuweisung. - Texte, unterschiedliche Datentypen und Wertebereiche vergleichenVergleiche Zeichenketten exakt und nach alphabetischer Reihenfolge, wandle eingegebenen Text vor dem Vergleich mit Zahlen um und prüfe Wertebereiche, Zugehörigkeit und
Nonemit dem passenden Operator.
- Zahlen mit den sechs Vergleichsoperatoren vergleichen
- Schreibe einseitige, zweiseitige und mehrseitige Verzweigungen, damit ein Programm in jeder Situation den passenden Codeblock ausführt, und sage für eine gegebene Eingabe genau voraus, welche Zeilen ausgeführt werden.
- Code nur ausführen, wenn eine Bedingung wahr istSchreibe eine
if-Anweisung mit Kopfzeile, Doppelpunkt und eingerücktem Block und vollziehe nach, welche Zeilen ausgeführt und welche übersprungen werden. - Mit if und else zwischen zwei Aktionen wählenErgänze einen
else-Zweig, damit genau einer von zwei Blöcken ausgeführt wird, und verwende einen bedingten Ausdruck, um in einer einzigen Zeile zwischen zwei Werten zu wählen. - Mit elif zwischen mehreren Fällen wählenBaue
if–elif–else-Ketten, die Bedingungen der Reihe nach prüfen und nur den ersten Zweig mit wahrer Bedingung ausführen, und ordne die Prüfungen so an, dass jede Eingabe im richtigen Fall landet.
- Code nur ausführen, wenn eine Bedingung wahr ist
- Verknüpfe und verneine Bedingungen mit
and,orundnot, sage ihre Ergebnisse mit Wahrheitstabellen voraus und lies längere Bedingungen in der Reihenfolge, in der Python sie auswertet.- Bedingungen mit and, or und not verknüpfen und verneinenSage die Ergebnisse von
and,orundnotmit Wahrheitstabellen voraus, übersetze Alltagsregeln in kombinierte Bedingungen und vermeide den klassischen Fehler mitor. - Vorhersagen, wie Python längere Bedingungen auswertetWende Operatorvorrang und Kurzschlussauswertung an, setze runde Klammern, die die beabsichtigte Gruppierung deutlich machen, und formuliere verneinte Bedingungen mit den de Morganschen Gesetzen um.
- Bedingungen mit and, or und not verknüpfen und verneinen
- Verschachtle Entscheidungen, wenn eine Wahl von einer anderen abhängt, prüfe Werte direkt anhand ihrer Wahrheitswertauswertung und vollziehe jeden Zweig nach und teste ihn, damit die Logik für jede Eingabe stimmt.
- Entscheidungen ineinander verschachtelnSetze eine
if-Anweisung in einen anderen Zweig, wenn eine zweite Entscheidung von der ersten abhängt, lies die Verschachtelung an der Einrückung ab und flache sie ab, wennandoderelifdasselbe einfacher ausdrückt. - Werte direkt anhand ihrer Wahrheitswertauswertung prüfenSage voraus, welche Werte Python in einer Bedingung als wahr oder falsch auswertet, nutze das für eine kurze Prüfung auf leere Eingaben und vermeide die Fallen, in denen sich
0,"0"oder"False"unerwartet verhalten. - Jeden Zweig einer Entscheidung nachvollziehen und testenVollziehe eine Entscheidung von Hand nach, wähle Testeingaben, die jeden Zweig und jede Grenze erreichen, und repariere Bedingungen, die Lücken, Überschneidungen oder nie ausführbare Zweige hinterlassen.
- Entscheidungen ineinander verschachteln
- Verwende die
match-Anweisung von Python, um einen Wert mit mehreren Mustern zu vergleichen, Werte zu binden und Fallbedingungen hinzuzufügen, und entscheide, wannmatchübersichtlicher ist als eineif–elif-Kette.- Einen Wert mit festen Fällen abgleichenSchreibe eine
match-Anweisung mit Literalmustern, Alternativen und einem Platzhalter und sage voraus, welcher einzelne Fall ausgeführt wird. - Werte binden und Fälle mit Bedingungen versehenVerwende Bindungsmuster und
as, um dem passenden Wert einen Namen zu geben, ergänze Fallbedingungen mitiffür Bedingungen, die ein Literal nicht ausdrücken kann, und vermeide die Falle, dass ein Variablenname in einem Fall auf alles passt.
- Einen Wert mit festen Fällen abgleichen
Bedingungen in Python einfach erklärt
1Vergleiche, die mit Ja oder Nein antworten
Ein Programm braucht eine genaue Prüfung, bevor es eine Aktion wählen kann. Vergleiche machen aus Fragen über Werte Antworten, die Python verwenden kann: Ist die Punktzahl hoch genug, stimmt die Antwort überein, liegt die Eingabe in einem gültigen Bereich? Für Zahlen und Texte gelten unterschiedliche Vergleichsregeln. Wenn du diese Regeln genau liest, erkennst du Fehler, die auf dem Bildschirm plausibel aussehen, besonders an einer Grenze oder wenn eingetippte Ziffern noch als Text gespeichert sind.
1.1 Zahlen, Gleichheit und Grenzen
Ein Vergleich stellt eine Frage über Werte. Sein Ergebnis ist ein boolescher Wert: True oder False. Das sind Werte vom Datentyp bool, die mit großem Anfangsbuchstaben und ohne Anführungszeichen geschrieben werden. "True" ist Text; das kleingeschriebene true ist ein Name und löst einen NameError aus, wenn er nicht definiert wurde.
Wähle den Operator, der zur Regel passt
| Operator | Frage | Mit x = 7 |
|---|---|---|
== | Gleich? | x == 7 ergibt True |
!= | Ungleich? | x != 7 ergibt False |
< | Kleiner als? | x < 7 ergibt False |
<= | Kleiner oder gleich? | x <= 7 ergibt True |
> | Größer als? | x > 5 ergibt True |
>= | Größer oder gleich? | x >= 7 ergibt True |
Die Operatoren aus zwei Zeichen werden zusammengeschrieben, mit = an zweiter Stelle. Schreibe <=, nicht =<. Eine ganze Zahl und eine Gleitkommazahl können beim Vergleich gleich sein: 7 == 7.0 ergibt True, weil ihre Zahlenwerte übereinstimmen.
Ein Vergleich ist ein Ausdruck, daher kannst du sein Ergebnis ausgeben oder speichern:
x = 7
is_big = x > 5
print(is_big)
Python wertet x > 5 aus, erhält True und weist diesen Wert is_big zu. Die Ausgabe ist True. Durch einen Namen wie is_big oder has_ticket liest sich eine boolesche Variable wie eine Ja-Nein-Frage.
Halte Zuweisung und Vergleich auseinander
x = 5 speichert einen neuen Wert in x. x == 5 prüft den aktuellen Wert, ohne ihn zu ändern. if x = 5: ist ein Syntaxfehler. Der umgekehrte Fehler ist schwerer zu bemerken:
x = 7
x == 5
print(x)
In einem Skript wird das Ergebnis des Vergleichs nicht verwendet. Die Ausgabe bleibt 7; die mittlere Zeile weist nie 5 zu.
Erst rechnen, dann vergleichen
Bei 2 + 3 > 4 addiert Python zuerst und erhält 5, dann vergleicht es 5 > 4. Das Ergebnis ist True. Ein nützlicher Test für ganze Zahlen ist n % 2 == 0: % liefert den Rest einer Division, und gerade Zahlen lassen bei der Division durch 2 den Rest 0.
Für n = 10 lauten die Schritte 10 % 2, dann 0 == 0, was True ergibt. Für n = -7 ist -7 % 2 gleich 1, also ist der Test auf gerade Zahlen False. Mit dem positiven Divisor 2 liefert Python für eine ungerade ganze Zahl den Rest 1, auch für eine negative.
Entscheide, ob die Grenze dazugehört
„Mindestens 18“ schließt 18 ein: age >= 18. „Über 18“ schließt sie aus: age > 18. Ebenso ist „unter 13“ age < 13, und „höchstens 3“ ist bags <= 3. Prüfe beim Wählen eines Operators genau den Grenzwert. Bei age = 18 ist der erste Alterstest wahr und der zweite falsch.
Rechne mit winzigen Abweichungen bei Gleitkommazahlen
Viele Dezimalbrüche lassen sich binär nur näherungsweise darstellen. Python speichert 0.1 + 0.2 als 0.30000000000000004, daher ergibt 0.1 + 0.2 == 0.3 den Wert False.
Für einen Vergleich mit der absoluten Toleranz 1e-9 verwendest du:
print(abs((0.1 + 0.2) - 0.3) < 1e-9)
abs() liefert die Größe der Differenz ohne ihr Vorzeichen. Diese Differenz ist kleiner als ein Milliardstel, daher gibt dieser Test True aus. Die Toleranz legt fest, wie viel Abweichung diese Prüfung zulässt; sie ist keine exakte Gleichheit.
Wichtige Erkenntnisse
- Vergleiche liefern die booleschen Werte
TrueundFalse. =weist einen Wert zu;==vergleicht Werte, ohne sie zu ändern.- Wähle zwischen
<und<=sowie zwischen>und>=danach, ob die Grenze eingeschlossen ist. - Rechnungen werden vor Vergleichen ausgeführt, daher prüft
n % 2 == 0, ob eine Zahl gerade ist. - Bei berechneten Gleitkommazahlen brauchst du unter Umständen einen Toleranztest statt exakter Gleichheit.
1.2 Text, eingetippte Zahlen und Bereiche
Die Werte auf beiden Seiten eines Vergleichs sind ebenso wichtig wie der Operator. Text kann wie eine Zahl aussehen und trotzdem den Regeln für Zeichenketten folgen.
Vergleiche Texte exakt
Die Gleichheit von Zeichenketten prüft jedes Zeichen, einschließlich Groß- und Kleinschreibung und Leerzeichen. "yes" == "Yes" ist False, und "yes" == "yes " ist ebenfalls False. Um übliche Unterschiede in der Groß- und Kleinschreibung und Leerzeichen am Rand zuzulassen, vergleichst du eine bereinigte Kopie:
answer = " Yes "
print(answer.strip().lower() == "yes")
strip() entfernt Leerraumzeichen an beiden Enden. lower() wandelt Buchstaben in Kleinbuchstaben um. Der bereinigte Text ist "yes", daher ist das Ergebnis True. Der gespeicherte Wert von answer bleibt unverändert, es sei denn, du weist ihm den bereinigten Wert zu.
Verstehe die Reihenfolge von Zeichenketten
Python vergleicht Zeichenketten von links nach rechts anhand der Unicode-Codepunkte, also der Zahlen, die den Zeichen zugeordnet sind. Der Vergleich endet beim ersten ungleichen Zeichenpaar. Bei Buchstaben von a bis z ohne Akzente oder Umlaute in einheitlicher Groß- oder Kleinschreibung entspricht das der alphabetischen Reihenfolge: "apple" < "banana" ist True. Ist eine Zeichenkette der Anfang der anderen, kommt die kürzere zuerst: "cat" < "catalog" ist True.
Das ist keine vollständige Sortierregel wie im Wörterbuch. A bis Z haben die Codepunkte 65–90, a bis z die Codepunkte 97–122. Deshalb ist "Zebra" < "apple" True. Auch das é mit Akzent kommt nach z, daher ist "zebra" < "éclair" True.
Ziffern in Zeichenketten folgen derselben Zeichenregel. "10" < "9" ist True: Verglichen werden zuerst "1" und "9", nicht die Zahlen zehn und neun.
Wandle Eingaben für Zahlenentscheidungen um
input() gibt eine Zeichenkette zurück. Tippt jemand 5 ein, ergibt "5" == 5 den Wert False; der Gleichheitstest wandelt den Text nicht um. Bei Größenvergleichen ist es anders: "5" < 10 löst einen TypeError aus, weil Python diese Zeichenkette und diese ganze Zahl nicht in eine Reihenfolge bringen kann.
age = int(input("Age: "))
print(age >= 18)
Für den eingetippten Text "18" liefert int() die ganze Zahl 18, und der Test gibt True aus. Verwende float(), wenn die Eingabe eine Dezimalzahl darstellt.
Prüfe Bereiche mit einer Kette
0 <= score <= 100 verlangt, dass beide benachbarten Vergleiche wahr sind. Es bedeutet 0 <= score and score <= 100. Für score = 105 ist der untere Test erfüllt, der obere aber nicht, daher ist die ganze Kette False.
| Regel | Python-Test |
|---|---|
| Von 1 bis 10, beide Enden eingeschlossen | 1 <= x <= 10 |
| Echt zwischen 1 und 10 | 1 < x < 10 |
Eine Kette vergleicht nur Nachbarn. 1 < 3 > 2 ist True, weil 1 < 3 und 3 > 2 beide wahr sind; 1 wird nicht direkt mit 2 verglichen.
Wähle bei Bedarf Zugehörigkeit oder Identität
Die Zugehörigkeitsoperatoren prüfen, ob ein Text in einem anderen vorkommt. "nan" in "banana" ist True; "Ban" in "banana" ist False. "x" not in "banana" ist True.
None steht für „kein Wert“. Prüfe es mit result is None oder result is not None. Der Operator is fragt nach genau demselben Objekt, == dagegen nach gleichen Werten. Verwende == für die Gleichheit von Zahlen und Zeichenketten: Eine Identitätsprüfung wie x is 5 ist dafür unzuverlässig und erzeugt eine SyntaxWarning.
Wichtige Erkenntnisse
- Vergleiche von Zeichenketten beachten Groß- und Kleinschreibung und berücksichtigen Leerzeichen.
- Wandle eingetippte Ziffern vor Zahlenvergleichen mit
int()oderfloat()um. - Bei einem verketteten Bereichstest muss jeder benachbarte Vergleich erfüllt sein.
inprüft die Zugehörigkeit;is Noneprüft auf die Markierung für „kein Wert“.
2Auswählen, welcher Code ausgeführt wird
Ein Vergleich wird nützlich, wenn er eine Aktion steuert. Python kennzeichnet jede Wahl mit einer Bedingung und einem eingerückten Block, sodass der Aufbau des Codes zeigt, welche Zeilen zusammen ausgeführt werden. Du beginnst mit einem Block, der übersprungen werden kann, gibst ihm dann eine Alternative und wählst schließlich zwischen mehreren Fällen. Entscheidend ist, das Programm der Reihe nach zu verfolgen: Eine spätere Zeile kann einen Wert verwenden, den ein früherer Zweig gesetzt hat, und eine spätere Prüfung in einer Kette wird vielleicht nie erreicht.
2.1 Die if-Kopfzeile und ihr Block
Eine if-Anweisung führt einen Block nur aus, wenn ihre Bedingung wahr ist. Die Kopfzeile beginnt mit if, nennt die Bedingung und endet mit einem Doppelpunkt. Die Zeilen darunter sind eingerückt, um zu zeigen, dass sie zum Körper der Anweisung gehören.
Verfolge eine einseitige Verzweigung
temperature = 31
if temperature > 30:
print("Hot day")
print("Drink water")
print("Done")
In der Kopfzeile liest Python den aktuellen Wert von temperature. Der Vergleich 31 > 30 ist True, daher werden beide eingerückten Zeilen ausgeführt. Danach erreicht das Programm die Zeile außerhalb des Blocks. Die Ausgabe lautet:
Hot day
Drink water
Done
Ändere die erste Zeile in temperature = 25. Jetzt ist 25 > 30 False, daher überspringt Python den ganzen Körper. Nur Done wird ausgegeben. Die Bedingung wird einmal geprüft, wenn Python die Kopfzeile erreicht; ein if prüft sie nicht fortlaufend weiter.
Lass die Einrückung zeigen, was dazugehört
Üblich sind 4 Leerzeichen pro Einrückungsebene. Zeilen auf derselben Ebene gehören zum selben Block. Kehrst du zur äußeren Ebene zurück, endet der Block. Rückst du print("Done") um 4 Leerzeichen ein, wandert die Zeile in den Körper des if und gibt nur dann etwas aus, wenn die Bedingung erfüllt ist.
Ein Programmablaufplan zeigt dieselbe Wahl als Raute. Der True-Pfad führt in den Körper, der False-Pfad daran vorbei, und beide Pfade treffen sich bei der nächsten Anweisung außerhalb des Blocks.
| Problem | Was zu beheben ist |
|---|---|
| Fehlender Doppelpunkt | Beende die Kopfzeile mit :. |
| Kein eingerückter Körper | Rücke die Zeilen ein, die if steuert. |
| Uneinheitliche Einrückung | Richte Anweisungen, die zum selben Block gehören, bündig aus. |
| Gemischte Tabulatoren und Leerzeichen | Stelle den Editor so ein, dass er Leerzeichen einfügt. |
Python meldet bei diesen Problemen möglicherweise SyntaxError, IndentationError oder TabError. Prüfe zuerst die Kopfzeile und die Einrückung rund um die gemeldete Zeile. Runde Klammern um die Bedingung sind optional; if temperature > 30: ist die übliche Form.
Ein Körper darf nicht leer sein. Willst du einen Platz für eine spätere Aktion freihalten, schreibst du ein eingerücktes pass. Das ist eine gültige Anweisung, die nichts tut:
if temperature > 30:
pass
Getrennte Prüfungen sind unabhängig
score = 95
if score >= 50:
print("Pass")
if score >= 90:
print("Excellent")
Python erreicht beide Kopfzeilen. Beide Bedingungen sind wahr, daher werden beide Meldungen ausgegeben. Getrennte if-Anweisungen passen zu Regeln, deren Aktionen alle für dieselbe Eingabe gelten können.
Gib späterem Code einen Wert, den er verwenden kann
Ein Name, der nur im Körper zugewiesen wird, entsteht unter Umständen nie:
x = 0
if x > 0:
message = "positive"
print(message)
In einem frisch gestarteten Skript wird der Körper übersprungen, und message hat keinen Wert, daher löst die letzte Zeile einen NameError aus. Eine Lösung ist, vor der Verzweigung einen Startwert festzulegen:
x = 0
message = "not positive"
if x > 0:
message = "positive"
print(message)
Jetzt hat die spätere Zeile auf beiden Pfaden einen Wert. Für null gibt sie not positive aus; für ein positives x ersetzt der Körper diesen Text durch positive.
Wichtige Erkenntnisse
- Eine
if-Kopfzeile endet mit:, darauf folgt ein eingerückter Körper. - Bei einer falschen Bedingung wird der ganze Körper übersprungen; die Ausführung geht danach weiter.
- Getrennte
if-Anweisungen werden jeweils geprüft, wenn das Programm sie erreicht. - Gib einer Variablen einen Startwert oder weise ihr in jedem Zweig einen Wert zu, bevor du sie später liest.
passliefert einen gültigen Körper, der nichts tut.
2.2 Zwei Pfade und ein Wert zur Auswahl
Eine if–else-Anweisung wählt einen von zwei Blöcken. Ist die Bedingung wahr, führt Python den if-Körper aus, sonst den else-Körper. Erreicht die Ausführung diese Verzweigung, wird genau einer von beiden ausgeführt.
Richte die Alternativen bündig aus
number = int(input("Enter a whole number: "))
if number % 2 == 0:
print(number, "is even")
else:
print(number, "is odd")
Bei der Eingabe 14 ist der Rest 0, daher lautet die Ausgabe 14 is even. Bei der Eingabe -7 ist der Rest 1, daher lautet die Ausgabe -7 is odd. Das else gehört zu dem if auf derselben Einrückungsebene. Sein Körper hat eine eigene Einrückung.
Nach else steht keine Bedingung: Es bedeutet, dass die vorherige Bedingung falsch war. else number < 0: ist ein Syntaxfehler. Schreibe die Klausel direkt nach den if-Körper; eine fremde, nicht eingerückte Anweisung dazwischen zerstört die Struktur.
Prüfe, was „alles andere“ umfasst
Bei if answer == "yes": bedeutet ein else nicht nur "no". Es erfasst auch "maybe", "Yes" und "", weil keiner dieser Werte gleich "yes" ist. Das ist nützlich, wenn alle übrigen Eingaben dieselbe Aktion verdienen. Brauchen mehrere abgelehnte Eingaben unterschiedliche Reaktionen, sind weitere Prüfungen nötig.
Weise auf beiden Pfaden zu
Eine Versandregel gewährt ab einem Gesamtbetrag von 50 € kostenlosen Versand und berechnet sonst 5,99 €:
total = 42.50
if total >= 50:
shipping = 0
else:
shipping = 5.99
print(total + shipping)
Zuerst ergibt 42.50 >= 50 den Wert False. Python überspringt die Zuweisung von 0, führt das else aus und speichert 5.99. Die letzte Zeile steht außerhalb beider Körper und gibt 48.49 aus. Ändere total in 60: Der erste Körper speichert 0, der andere wird übersprungen, und die letzte Zeile gibt 60 aus. Auf beiden Wegen wird shipping definiert, bevor es verwendet wird.
Wähle einen Wert mit einem bedingten Ausdruck
Wenn sich die Zweige nur im zugewiesenen Wert unterscheiden, kann ein bedingter Ausdruck das in einer Zeile ausdrücken:
shipping = 0 if total >= 50 else 5.99
Seine Form ist value_if_true if condition else value_if_false. Obwohl der Wert für den wahren Fall zuerst dasteht, wertet Python zuerst die Bedingung aus. Es wertet nur den gewählten Wert aus und weist das Ergebnis dann shipping zu.
Ein weiteres Beispiel ist label = "even" if n % 2 == 0 else "odd". Für n = 14 wählt der Ausdruck "even", für n = -7 wählt er "odd".
| Bedarf | Passende Form |
|---|---|
| Mehrere Aktionen in einem der Zweige | Vollständige if–else-Blöcke |
| Einer von zwei Werten | Bedingter Ausdruck |
Der Ausdruck braucht beide Werte. x = 1 if flag ist unvollständig und löst einen SyntaxError aus, weil der else-Wert fehlt. Eine vollständige if-Anweisung darf else weglassen, weil sie auf dem False-Pfad einfach nichts tun kann; ein Ausdruck muss trotzdem einen Wert liefern.
Wichtige Erkenntnisse
else:hat keine Bedingung und steht bündig mit seinemif.- Ein
elseerfasst jede Eingabe, die die Bedingung ablehnt. - Weist du derselben Variablen in beiden Körpern einen Wert zu, ist sie nach jedem der beiden Pfade verfügbar.
- Ein bedingter Ausdruck hat die Form
a if condition else bund wertet nur den gewählten Wert aus.
2.3 Mehrere Fälle in bewusst gewählter Reihenfolge
Mit elif, kurz für „else if“, ergänzt du eine Entscheidung um eine weitere Prüfung. Python prüft die Bedingungen von oben nach unten. Die erste wahre Bedingung gewinnt, und der Rest der Kette wird übersprungen.
Verfolge eine Notenentscheidung
score = 85
if score >= 90:
grade = "A"
elif score >= 80:
grade = "B"
elif score >= 70:
grade = "C"
elif score >= 60:
grade = "D"
else:
grade = "F"
print(grade)
Die erste Prüfung, 85 >= 90, ist falsch. Die zweite, 85 >= 80, ist wahr, daher speichert Python "B". Die übrigen Bedingungen prüft es nicht, und den else-Zweig betritt es nicht. Die Ausgabe ist B.
| Punktzahl | Erster erfolgreicher Weg | Note |
|---|---|---|
90 | score >= 90 | A |
89 | score >= 80 | B |
60 | score >= 60 | D |
59 | Abschließendes else | F |
Nutze, was frühere fehlgeschlagene Prüfungen verraten
Wird elif score >= 80: erreicht, steht bereits fest, dass die Punktzahl unter 90 liegt. Bei ganzzahligen Punktzahlen deckt dieser Zweig 80 bis 89 ab. Ein zusätzliches and score < 90 würde eine Prüfung wiederholen, die das Programm schon erledigt hat.
Die Reihenfolge ist wichtig, weil sich diese Bereiche überschneiden. Steht score >= 60 zuerst, erfasst diese Prüfung 85 und 95, bevor die Prüfungen für die besseren Noten erreicht werden. Bei Prüfungen auf eine untere Schranke mit >= stellst du den höchsten Schwellenwert an den Anfang. Bei Prüfungen auf eine obere Schranke mit < beginnst du mit dem niedrigsten.
Fasse eine Entscheidung in einer Kette zusammen
Ersetzt du die Schlüsselwörter elif durch if, ändert sich das Verhalten. Bei einer Punktzahl von 85 weist die Prüfung für 80 den Wert "B" zu, danach die Prüfung für 70 den Wert "C" und die Prüfung für 60 den Wert "D". Der Endwert ist "D". Jedes neue if beginnt eine unabhängige Entscheidung.
Dieser Unterschied betrifft auch else. In einer Gruppe getrennter if-Anweisungen gehört ein abschließendes else nur zu seinem passenden if, nicht zur ganzen Gruppe. Halte die Zweige zusammen, wenn sie eine einzige Einteilung darstellen.
Denk an Grenzen und Eingaben, die zu keinem Fall passen
Eine elif-Kette kann beliebig viele weitere Prüfungen haben, und ihr abschließendes else ist optional. Ohne Auffangzweig wird unter Umständen kein Körper ausgeführt:
temp = 20
if temp < 18:
print("Cool")
elif temp > 24:
print("Warm")
Keine der beiden Bedingungen ist erfüllt. Ergänze else: mit einem eingerückten print("Comfortable"), wenn jede Temperatur eine Meldung braucht. Ebenso lässt t < 18, gefolgt von t > 18, genau 18 unberücksichtigt. Bei den Notenschwellen würde score > 90 den Wert 90 in den "B"-Zweig schicken.
Textmenüs haben denselben Aufbau: Prüfe choice == "1", dann choice == "2", und reagiere auf alles andere mit "Unknown option". Diese Prüfungen vergleichen Zeichenketten, weil input() Text zurückgibt. Wenn viele Prüfungen einen Wert mit festen Auswahlmöglichkeiten vergleichen, bietet match eine andere Möglichkeit, die Entscheidung aufzubauen.
Wichtige Erkenntnisse
- Von einer
if–elif-Kette wird nur der erste wahre Zweig ausgeführt. - Frühere falsche Prüfungen schränken die Eingaben ein, die einen späteren Zweig erreichen können.
- Ordne sich überschneidende Schwellenwerte so an, dass eine weite Prüfung keinen engeren Fall verdeckt.
- Getrennte
if-Anweisungen können mehrere Körper ausführen und frühere Zuweisungen überschreiben. - Ein abschließendes
elsebehandelt Eingaben, die keine der Prüfungen bestehen. - Teste genau die Schwellenwerte, um Lücken und Um-eins-Fehler zu finden.
3Prüfungen kombinieren, ohne die Regel zu verändern
Echte Entscheidungen hängen oft von mehreren Tatsachen zugleich ab: Ein Bereich hat zwei Ränder, und für einen Zutritt braucht man vielleicht sowohl eine Erlaubnis als auch einen freien Platz. Boolesche Operatoren verbinden solche Tatsachen zu einer Bedingung. Auch ihre Gruppierung und die Reihenfolge der Auswertung spielen eine Rolle, denn Python kann aufhören, bevor es einen Teil der Prüfung erreicht. Übersetze zuerst die Regel und verfolge dann den Ausdruck von links nach rechts; achte dabei auf runde Klammern und auf Teile, die übersprungen werden.
3.1 Beides, eines davon und das Gegenteil
Mit den booleschen Operatoren and, or und not baust du eine Bedingung aus einfacheren Bedingungen auf. Python schreibt sie als kleingeschriebene Wörter.
Lies alle Möglichkeiten ab
Bei booleschen Eingangswerten ergibt and nur dann True, wenn beide wahr sind. or ergibt True, wenn mindestens einer wahr ist, auch wenn beide wahr sind. Das ist ein einschließendes Oder.
A | B | A and B | A or B |
|---|---|---|---|
True | True | True | True |
True | False | False | True |
False | True | False | True |
False | False | False | False |
not kehrt einen Wahrheitswert um: not True ergibt False, und not False ergibt True. Eine Wahrheitstabelle listet jede Kombination boolescher Eingangswerte auf. Zwei Eingangswerte brauchen vier Zeilen, drei brauchen acht. Jeder zusätzliche unabhängige boolesche Eingangswert verdoppelt die Anzahl der Kombinationen.
Für A and not B kehrst du zuerst B um und verknüpfst das Ergebnis dann mit A. In der Zeile A = True, B = False ist not B gleich True, also ist das Ergebnis True. Die anderen drei Zeilen ergeben False.
Übersetze eine Regel in vollständige Prüfungen
Ein Museum ermäßigt den Eintritt für Besucher unter 12 oder ab 65 Jahren:
has_discount = age < 12 or age >= 65
Beim Alter 10 ist der erste Vergleich erfüllt, bei 65 der zweite. Die Alterswerte 30 und 64 erfüllen keinen der beiden. Mit and müsste dasselbe Alter zugleich unter 12 und mindestens 65 sein, was unmöglich ist.
Ein Fahrgeschäft verlangt eine Körpergröße von mindestens 120 Zentimetern und keine Herzerkrankung:
can_ride = height >= 120 and not has_heart_condition
Beide Anforderungen müssen zugleich erfüllt sein. Bei der Mindestgröße und has_heart_condition = False sind beide Teile erfüllt. Ist eine der Anforderungen nicht erfüllt, ist can_ride gleich False.
Unterscheide innerhalb und außerhalb eines Bereichs
| Bedeutung | Test |
|---|---|
| Innerhalb von 0 bis 100 | score >= 0 and score <= 100 |
| Außerhalb von 0 bis 100 | score < 0 or score > 100 |
Der Test auf „innerhalb“ braucht beide Schranken. Der Test auf „außerhalb“ braucht eine der beiden Überschreitungen. score < 0 and score > 100 kann für eine einzelne Zahl nie wahr sein.
Jeder Vergleich braucht beide Seiten. score >= 0 and <= 100 ist unvollständige Syntax. Ein subtileres Problem läuft ohne Fehlermeldung:
if answer == "y" or "yes":
print("Accepted")
Python liest (answer == "y") or "yes". Ist der Vergleich falsch, sorgt die nicht leere Zeichenkette "yes" trotzdem dafür, dass die Bedingung als wahr ausgewertet wird. Wiederhole den Vergleich: answer == "y" or answer == "yes".
Alltagssprache braucht dieselbe Sorgfalt. „Am Samstag und Sonntag geschlossen“ bedeutet day == "Saturday" or day == "Sunday"; ein Tag muss nicht beide Namen zugleich haben. Eine boolesche Variable verneinst du direkt mit not is_member. Einen verneinten Vergleich wie not (age >= 18) kannst du auch einfacher als age < 18 schreiben. Die Operatoren von Python sind hier Wörter, nicht &&, || oder !.
Wichtige Erkenntnisse
andverlangt, dass beide booleschen Eingangswerte wahr sind; das einschließendeorverlangt mindestens einen.notkehrt einen Wahrheitswert um und liefert immer einen booleschen Wert.- Für „innerhalb eines Bereichs“ brauchst du
and, für „außerhalb“ brauchst duor. - Wiederhole auf jeder Seite eines booleschen Operators den vollständigen Vergleich.
- Eine Wahrheitstabelle prüft jede Kombination, auch den Fall, dass beide Eingangswerte wahr sind.
3.2 Gruppierung, übersprungene Teile und Verneinung
Bei einer längeren Bedingung sind zwei Fragen zu klären: wie ihre Teile gruppiert werden und welche Teile Python tatsächlich auswertet. Der Operatorvorrang beantwortet die erste Frage, die Kurzschlussauswertung die zweite.
Lies zuerst die Gruppierung ab
Für die hier verwendeten Operatoren reicht der Vorrang von stärker zu schwächer bindend:
- Potenzierung:
**. - Multiplikation, Division, abrundende Division, Rest:
*,/,//,%. - Addition und Subtraktion:
+,-. - Vergleiche, einschließlich
in,not in,isundis not. not, dannand, dannor.- Der bedingte Ausdruck:
a if condition else b.
Runde Klammern ändern die Gruppierung. So wird zum Beispiel x > 3 or x < 0 and x != 5 als x > 3 or (x < 0 and x != 5) gruppiert. Bei x = 5 ist der linke Vergleich wahr, und die gesamte rechte Gruppe wird übersprungen. Das Ergebnis ist True.
Bei (x > 3 or x < 0) and x != 5 machen die Klammern dagegen die erste Gruppe zu einem Operanden von and. Bei x = 5 ist diese Gruppe wahr, aber x != 5 ist falsch, daher ist das Ergebnis False.
Deshalb akzeptiert is_weekend or is_holiday and is_sunny jedes Wochenende, auch bei Regen. Für die Regel „ein freier Tag, der außerdem sonnig ist“ schreibst du (is_weekend or is_holiday) and is_sunny.
Verfolge die Auswertung von links nach rechts
| Ausdruck | Wann Python B überspringt |
|---|---|
A and B | A wird als falsch ausgewertet |
A or B | A wird als wahr ausgewertet |
Bei and hat ein falscher erster Teil die gesamte Anforderung bereits ausgeschlossen. Bei or hat ein wahrer erster Teil sie bereits erfüllt. Der Vorrang zwingt Python nicht, einen übersprungenen Operanden zu berechnen, nur weil er stärker bindende Operatoren enthält.
Das kannst du nutzen, um eine Schutzbedingung vor eine Operation zu setzen, die sonst fehlschlagen würde:
count = 0
total = 50
is_large_average = count != 0 and total / count > 10
print(is_large_average)
count != 0 ist falsch, daher versucht Python 50 / 0 gar nicht erst. Es speichert False und gibt es aus. Vertauschst du die Operanden, wird zuerst die Division versucht, und es kommt zu einem ZeroDivisionError; die spätere Prüfung kann eine frühere Berechnung nicht schützen.
Ziehe not in eine geklammerte Prüfung hinein
Die de Morganschen Gesetze formen eine Verneinung um, indem sie jeden Teil umkehren und den verbindenden Operator austauschen:
| Original | Äquivalent |
|---|---|
not (A and B) | not A or not B |
not (A or B) | not A and not B |
„Kein Teenager“ lässt sich als not (age >= 13 and age <= 19) prüfen. Der äquivalente direkte Test ist age < 13 or age > 19. Die Alterswerte 12 und 20 bestehen ihn, 13, 16 und 19 nicht.
Behältst du and bei, nachdem du beide Teile verneint hast, ändert sich die Regel. Bei A = True, B = False ist not (A and B) wahr, aber not A and not B falsch. Vergleiche jede Zeile der Wahrheitstabelle, wenn du prüfst, ob zwei boolesche Formen äquivalent sind.
Für eine Variable, die bereits einen booleschen Wert enthält, schreibst du if is_valid: oder if not is_valid:. Ein Vergleich mit True oder False fügt eine Prüfung hinzu, die die Bedingung nicht braucht.
Wichtige Erkenntnisse
- Der Vorrang legt die Gruppierung eines Ausdrucks fest; die Kurzschlussauswertung bestimmt, welche Operanden erreicht werden.
andüberspringt seinen rechten Operanden, wenn der linke als falsch ausgewertet wird;orüberspringt ihn, wenn der linke als wahr ausgewertet wird.- Setze eine Schutzbedingung vor die Operation, die sie schützt.
- Die de Morganschen Gesetze verneinen beide Teile und tauschen
andundorgegeneinander aus. - Mache mit runden Klammern die beabsichtigte Gruppierung sichtbar, wenn du
andundormischst. - Prüfe boolesche Variablen direkt mit ihrem Namen oder mit
not.
4Entscheidungen leicht nachvollziehbar und testbar machen
Eine Entscheidung kann von einer anderen Entscheidung abhängen, und ein Wert kann ohne ausdrücklichen Vergleich als Bedingung dienen. Beides macht Skripte kürzer, schafft aber auch Pfade, die leicht übersehen werden. Die Einrückung zeigt, welche Prüfungen von früheren Entscheidungen abhängen; die Wahrheitswertauswertung erklärt, wie sich leerer Text und null verhalten. Wenn du diese Pfade nachvollziehst und genau die Grenzen testest, findest du fehlende Reaktionen, überschriebene Werte und Zweige, die keine Eingabe erreichen kann.
4.1 Entscheidungen in anderen Zweigen
Eine verschachtelte Verzweigung setzt eine Entscheidung in einen Zweig einer anderen. Die innere Entscheidung wird nur erreicht, wenn die Ausführung diesen äußeren Zweig betritt. Jede Verschachtelungsebene fügt 4 Leerzeichen Einrückung hinzu.
Verfolge die äußere Wahl vor der inneren
has_ticket = True
age = 15
if has_ticket:
if age >= 13:
print("Enjoy the movie")
else:
print("This movie needs an adult")
else:
print("Please buy a ticket first")
Zuerst ist has_ticket wahr, daher betritt Python den äußeren Körper. Dann prüft es 15 >= 13, erhält wahr und gibt Enjoy the movie aus. Die Körper des inneren und des äußeren else werden beide übersprungen.
Ändere das Alter auf 10 und lass das Ticket unverändert. Python betritt weiterhin den äußeren Körper, aber die innere Bedingung ist nicht erfüllt, daher gibt es This movie needs an adult aus. Mit has_ticket = False wird die Altersprüfung nie erreicht; das äußere else gibt Please buy a ticket first aus.
Ordne jedes else über die Einrückung zu
Ein else gehört zu dem if auf seiner eigenen Einrückungsebene. Verschiebst du es, kann sich das Verhalten ändern, auch wenn das Skript gültig bleibt. Betrachte diese kleinere Variante:
if has_ticket:
if age >= 13:
print("Enter")
else:
print("Buy a ticket")
Das else gehört zu if has_ticket:. Ein 10-jähriges Kind mit Ticket erhält keine Meldung. Rückst du dieses else samt seinem Körper um eine Ebene nach innen, gehört es stattdessen zu if age >= 13:. Jetzt erhält dasselbe Kind Buy a ticket, während jemand ohne Ticket keine Meldung erhält. Die geänderte Anordnung drückt eine andere Regel aus.
Im vollständigen Kinobeispiel hat das innere if bereits ein else. Würdest du dort das äußere else nach innen verschieben, entstünden zwei Alternativen für dasselbe if, und es käme zu einem Syntaxfehler.
Flache zwei Anforderungen ab
Gibt es nur eine Aktion und hat keine der beiden Ebenen ein else, lässt sich mit and oft eine Verschachtelungsebene einsparen:
if is_member and total >= 50:
print("Free shipping")
Das führt dieselbe Aktion aus wie ein äußeres if is_member: mit einem inneren if total >= 50:. Beide Anforderungen müssen erfüllt sein, und die zweite wird erst erreicht, wenn die erste erfüllt ist. Behalte die Verschachtelung bei, wenn die äußeren Zweige eigene, unterschiedliche Aktionen brauchen, wie beim Ticketkauf.
Ein else, dessen einzige Aktion eine weitere if–else-Anweisung ist, kann zu einer elif-Kette werden. Für positiv, negativ und null lautet die flache Form if x > 0:, dann elif x < 0:, dann else:. Sie behält dieselben drei Ergebnisse bei weniger Einrückung bei.
Validiere, bevor du einordnest
Eine Notenentscheidung muss Punktzahlen außerhalb des zulässigen Bereichs zurückweisen, bevor sie einen Notenbuchstaben vergibt:
if 0 <= score <= 100:
if score >= 90:
print("A")
else:
print("Below A")
else:
print("Score must be between 0 and 100")
Bei score = 150 schlägt die äußere Prüfung fehl, daher wird keine Note vergeben. Verschachtelung macht auch unmögliche Pfade sichtbar: Ein inneres if x < 5: unter if x > 10: kann nie erfüllt sein. Wird die Einrückung tief, suche nach Anforderungen, die sich zusammenfassen lassen, nach einer elif-Kette oder nach einer früheren Validierung, die die übrigen Pfade übersichtlicher macht.
Wichtige Erkenntnisse
- Eine innere Bedingung wird erst geprüft, wenn ihr äußerer Zweig betreten wurde.
- Die Einrückung bestimmt, zu welchem
ifeinelsegehört. - Zwei verschachtelte Anforderungen mit einer einzigen Aktion und ohne Alternativen lassen sich zu einer
and-Bedingung zusammenfassen. - Validiere den zulässigen Bereich, bevor du eine Kategorie zuordnest.
- Widersprechen sich innere und äußere Anforderungen, entsteht unerreichbarer Code.
4.2 Leer, null und Werte als Bedingungen
Python kann einen Wert direkt in einer Bedingung prüfen. Seine Wahrheitswertauswertung entscheidet, ob der Körper ausgeführt wird. Das spart Vergleiche, aber das Ergebnis der Wahrheitswertauswertung kann von dem abweichen, was der Text des Werts zu sagen scheint.
Erkenne als falsch ausgewertete Werte
Bei den hier verwendeten eingebauten Datentypen werden False, None, die Zahl null, leere Zeichenketten und leere Sammlungen als falsch ausgewertet. Zahlen ungleich null und nicht leere Zeichenketten oder Sammlungen werden als wahr ausgewertet.
| Wert | bool(value) | Grund |
|---|---|---|
0, 0.0 | False | Die Zahl null |
-3 | True | Zahl ungleich null |
"" | False | Leere Zeichenkette |
" " | True | Enthält ein Leerzeichen |
"0", "False", "no" | True | Nicht leere Zeichenketten |
None | False | Markierung für „kein Wert“ |
[], (), {} | False | Leere Sammlungen |
bool() wandelt einen Wert in seinen booleschen Wahrheitswert um. In einer Bedingung wählt if value: denselben Zweig wie if bool(value):. Der gespeicherte Wert wird dabei nicht in einen booleschen Wert umgewandelt.
Prüfe auf leere Eingaben, ohne sie falsch zu deuten
name = input("Name: ")
if name:
print("Hello", name)
else:
print("No name entered")
Drückst du die Eingabetaste, ohne etwas einzutippen, ergibt das "", daher wird der zweite Körper ausgeführt. Ein Name, der nur aus Leerzeichen besteht, ist nicht leer und besteht den ersten Test. if name.strip(): prüft dagegen den Text, nachdem die Leerraumzeichen am Rand entfernt wurden, sodass auch eine Antwort aus lauter Leerzeichen durchfällt.
Eine Ja-Nein-Antwort braucht eine andere Frage. if answer: führt seinen Körper für "no" und "False" aus, weil beide Zeichen enthalten. Um eine Zustimmung zu erkennen, vergleichst du den Text, zum Beispiel mit answer == "yes". Die Wahrheitswertauswertung prüft, ob etwas leer ist, nicht, was ein Wort bedeutet.
Unterscheide eine zulässige Null von fehlenden Daten
Angenommen, quantity ist None, solange noch kein Wert angegeben wurde, und kann zulässigerweise 0 sein. if quantity: lehnt beides ab. Verwende quantity is not None, um zu fragen, ob ein Wert vorhanden ist; dieser Test akzeptiert null.
Bei einer echten booleschen Variablen ist die direkte Prüfung klar. Bei anderen Werten tut x == True etwas anderes als if x:. Mit x = 5 besteht der Test über die Wahrheitswertauswertung, aber 5 == True ist falsch; bei der Gleichheit von Zahlen gilt True als gleich 1, nicht als gleich jeder Zahl ungleich null.
and und or geben einen der geprüften Werte zurück
Diese Operatoren geben einen Operanden zurück, der nicht unbedingt ein boolescher Wert ist:
| Ausdruck | Rückgabewert |
|---|---|
"" or "Guest" | "Guest" |
"Ana" or "Guest" | "Ana" |
0 and 5 | 0 |
3 and 5 | 5 |
Bei or gibt Python den linken Wert zurück, wenn er als wahr ausgewertet wird; andernfalls wertet es den rechten Wert aus und gibt ihn zurück. Bei and gibt es den linken Wert zurück, wenn er als falsch ausgewertet wird; andernfalls wertet es den rechten Wert aus und gibt ihn zurück.
display_name = name or "Guest" liefert einen Standardwert für eine leere Eingabe. Dasselbe Vorgehen ersetzt mit quantity or 1 eine echte Null durch 1. Setze einen Standardwert auf diese Weise nur ein, wenn jeder als falsch ausgewertete Wert „fehlt“ bedeutet. not verhält sich anders: Es gibt immer True oder False zurück. Muss eine gespeicherte Merkvariable boolesch sein, wandelt has_name = bool(name or nickname) den ausgewählten Text in einen Wahrheitswert um.
Wichtige Erkenntnisse
- Leere eingebaute Container und leerer Text, null,
NoneundFalsewerden als falsch ausgewertet. - Nicht leere Zeichenketten werden als wahr ausgewertet, auch wenn sie
"0"oder"False"lauten. - Verwende
is not None, wenn null ein zulässiger angegebener Wert ist. andundorgeben Operanden zurück;notgibt immer einen booleschen Wert zurück.- Ein Standardwert mit
orersetzt jeden als falsch ausgewerteten linken Wert, auch null. strip()macht eine Eingabe aus lauter Leerzeichen leer, bevor sie geprüft wird.
4.3 Pfade nachvollziehen und Grenzen testen
Ein Skript kann ohne Syntaxfehler laufen und trotzdem den falschen Zweig wählen. Beim Nachvollziehen des Programmablaufs verfolgst du einen Durchlauf von Hand. Beim Testen führst du das Programm mit ausgewählten Eingaben aus und vergleichst das beobachtete Ergebnis mit dem Ergebnis, das die Regel verlangt.
Plane einen Pfad und vollziehe ihn nach
Bevor du Code schreibst, formulierst du die Entscheidungen als Schritte in Alltagssprache, also als Pseudocode. Ein Programmablaufplan stellt jede Bedingung als Raute mit True- und False-Pfeil dar. Beide Pfade brauchen einen klaren nächsten Schritt oder ein Ende.
Um Code nachzuvollziehen, notierst du die Startwerte, wertest jede erreichte Bedingung aus, hältst Zuweisungen fest und schreibst die Ausgabe exakt ab. Für die Notenkette mit score = 72:
| Erreichte Bedingung | Ergebnis | Aktion |
|---|---|---|
score >= 90 | False | Weiter zur nächsten Prüfung |
score >= 80 | False | Weiter zur nächsten Prüfung |
score >= 70 | True | grade auf "C" setzen |
| Rest der Kette | Nicht ausgewertet | Nach der Kette weitermachen |
„Nicht ausgewertet“ ist etwas anderes als falsch. Python hat bereits einen Zweig gewählt und braucht die späteren Vergleiche daher nicht.
Decke jeden Zweig und jede Grenze ab
Eine Kette mit vier Zweigen braucht mindestens vier Eingaben, damit jeder Zweig einmal ausgeführt wird. Wähle sie nach den vorgesehenen Wegen aus, nicht danach, wie verschieden die Zahlen aussehen. Mehrere hohe Punktzahlen führen womöglich alle durch denselben ersten Körper.
Zweigüberdeckung allein übersieht unter Umständen eine falsche Grenze. Für age >= 18 testest du 17, 18 und 19. Ein irrtümliches > verhält sich bei den beiden äußeren Werten wie erwartet, weist aber genau den Grenzwert ab. Für die Notenschwelle 90 vergleichst du 89, 90 und 91; an den anderen Schwellen gehst du genauso vor. Bei Dezimaleingaben wählst du benachbarte Werte, die zur Genauigkeit der Messung passen.
Finde Zweige, die nie ausgeführt werden können
if score >= 60:
print("Pass")
elif score >= 90:
print("Excellent")
Der zweite Zweig ist unerreichbar. Jede Punktzahl ab 90 hat bereits die erste Prüfung bestanden. Stelle den strengeren Schwellenwert an den Anfang, oder passe die Bereiche an die beabsichtigte Regel an.
Eine Lücke lässt einen beabsichtigten Fall unbehandelt: t < 0, gefolgt von t > 0, überspringt die Null. Eine Überschneidung kann mehrere unabhängige Aktionen auslösen: Die getrennten Prüfungen t >= 0 und t <= 10 sind für 5 beide erfüllt. Eine Kette lässt nur ihren ersten wahren Zweig zu, aber ihre Reihenfolge entscheidet trotzdem, welche der sich überschneidenden Bedingungen gewinnt.
Teste auch unbequeme Eingaben
Teste negative Werte, null, leeren Text und großgeschriebene Antworten, wenn das Skript Kleinbuchstaben erwartet. Werden nur "y" und "n" akzeptiert, gib auf jeden anderen Text eine klare Antwort wie "Please answer y or n".
Verhält sich ein Test unerwartet, untersuche den Wert und seinen Datentyp, bevor du den verdächtigen Vergleich auswertest:
print(repr(age), type(age))
Für age = "18" gibt das '18' <class 'str'> aus. Wandle den Text um, bevor du age >= 18 ausprobierst; würdest du den fehlerhaften Vergleich in dasselbe print() zur Fehlersuche schreiben, käme es zu einem TypeError, bevor die diagnostische Ausgabe erscheint. Bei Fehlern im Aufbau prüfst du die Einrückung und die Syntaxfehlermeldung.
Schließlich kann ein Vergleich eine boolesche Merkvariable (Flag) direkt setzen: is_adult = age >= 18. Das ersetzt zwei Zweige, die nur True bzw. False zuweisen. Verwende bool(), wenn der zugrunde liegende Ausdruck eine andere Art von Wert liefern kann.
Wichtige Erkenntnisse
- Vollziehe nur die Bedingungen nach, die das Programm erreicht, und vermerke übersprungene Prüfungen als übersprungen.
- Teste jeden Zweig sowie für jede Grenze den Grenzwert und die benachbarten Werte.
- Weit gefasste Prüfungen weiter oben können spätere Zweige unerreichbar machen.
- Prüfe Lücken, Überschneidungen und unerwartete Eingaben anhand der beabsichtigten Regel.
- Untersuche den Wert und seinen Datentyp, bevor du einen Vergleich auswertest, der fehlschlagen könnte.
5Mit match zwischen Fällen wählen
Menüs und Befehle vergleichen oft einen Wert mit mehreren festen Auswahlmöglichkeiten. Eine match-Anweisung ordnet diese Möglichkeiten als Muster an und führt den ersten passenden Fall aus. Literale, Alternativen und ein abschließender Platzhalter reichen für viele einfache Menüs. Bindungen und Fallbedingungen machen die Anweisung flexibler, aber ein Name in einem Muster verhält sich anders als ein Name in einem Vergleich. Kennst du diesen Unterschied, verhinderst du, dass ein Fall versehentlich jede Eingabe akzeptiert.
5.1 Feste Werte, Alternativen und ein Auffangfall
Eine match-Anweisung, verfügbar ab Python 3.10, gleicht einen Wert nacheinander mit einer Reihe von Mustern ab. Dieser Wert ist das Vergleichsobjekt. Jedes case liefert ein Muster und einen eingerückten Körper.
Verfolge den ersten passenden Fall
command = "stop"
match command:
case "start":
print("Starting")
case "stop":
print("Stopping")
case _:
print("Unknown command")
print("Ready")
Das Vergleichsobjekt ist "stop". Es passt nicht auf "start", daher probiert Python den nächsten Fall. "stop" passt, und der Körper gibt Stopping aus. Danach verlässt Python die gesamte match-Anweisung und gibt Ready aus. Nur ein Fallkörper wird ausgeführt; die Ausführung läuft nicht in den nächsten Körper weiter, und ein break ist nicht nötig.
Das Vergleichsobjekt "jump" erreicht das abschließende Platzhaltermuster _, das jeden Wert akzeptiert. Die Ausgabe ist Unknown command, dann Ready. Ohne diesen Fall führt ein Vergleichsobjekt, auf das nichts passt, einfach keinen Fallkörper aus, und das Programm macht nach der Anweisung weiter.
Halte Aufbau und Auffangfall in Ordnung
Die case-Kopfzeilen sind unter match um 4 Leerzeichen eingerückt, ihre Körper um weitere 4 Leerzeichen. Jede Kopfzeile endet mit einem Doppelpunkt. Ein case _: ohne Fallbedingung muss der letzte Fall sein, weil es alles akzeptiert. Stehen weitere Fälle danach, kommt es zu einem SyntaxError: Diese späteren Muster könnten nie erreicht werden.
Ein Platzhalter mit Fallbedingung darf weiter oben stehen, weil seine zusätzliche Bedingung falsch sein kann. Eine match-Anweisung in einem Skript ohne Schleifen kann außerdem kein break enthalten; diese Anweisung braucht eine umgebende Schleife.
Verstehe, wie Literale passen
Ein Literalmuster besteht aus einer festen Zahl, einer Zeichenkette, True, False oder None. Muster aus Zeichenketten passen nur exakt und beachten Groß- und Kleinschreibung: "stop" passt nicht auf "Stop". Zahlenmuster beruhen auf Gleichheit, daher passt case 1: auf 1, 1.0 und True, das gleich 1 ist.
Die Muster True, False und None beruhen dagegen auf Identität. Deshalb passt case True: auf den booleschen Wert True, aber nicht auf die ganze Zahl 1. Die Reihenfolge der Muster ist wichtig, wenn ein Zahlenfall und ein boolescher Fall beide das Vergleichsobjekt akzeptieren könnten.
Verbinde feste Alternativen mit einem senkrechten Strich
Ein Oder-Muster verbindet Alternativen mit |:
day = int(input("Day number: "))
match day:
case 6 | 7:
print("Weekend")
case 1 | 2 | 3 | 4 | 5:
print("Weekday")
case _:
print("Not a day number")
Bei 6 wird der erste Körper ausgeführt, bei 3 der zweite, bei 9 der Platzhalterfall. Ohne int() bleibt die Eingabe "6" eine Zeichenkette und passt nicht auf die Zahl 6.
Verwende das Trennzeichen für Muster |, nicht das boolesche Wort or. case "y" or "yes": ist ungültig, case "y" | "yes": ist gültig.
| Entscheidung | Naheliegende erste Wahl |
|---|---|
| Ein Vergleichsobjekt wird mit vielen festen Werten verglichen | match |
Bereiche wie score >= 90 | if–elif |
| Bedingungen mit verschiedenen Variablen | if–elif |
Bei festen Befehlen kann eine if–elif-Kette mit Gleichheitstests dieselben Ausgaben erzeugen. Wähle den Aufbau, bei dem sich die Fälle am leichtesten lesen lassen.
Wichtige Erkenntnisse
matchbraucht Python 3.10 oder neuer und führt nur den ersten passenden Fall aus.- Ein Platzhalter
_ohne Fallbedingung akzeptiert alles und muss der letzte Fall sein. - Verbinde alternative Muster mit
|. - Literale aus Zeichenketten und Zahlen passen aufgrund von Gleichheit; die Muster
True,FalseundNoneberuhen auf Identität. - Passt kein Fall und gibt es keinen Auffangfall, wird kein Körper ausgeführt.
- Verwende
matchfür feste Auswahlmöglichkeiten undif–eliffür gewöhnliche Bereichsprüfungen.
5.2 Bindungen, Fallbedingungen und benannte Werte
Muster können mehr, als ein festes Literal zu prüfen. Ein Muster kann dem Vergleichsobjekt einen Namen geben, und eine Fallbedingung kann eine zusätzliche Bedingung prüfen, bevor der Fall akzeptiert wird.
Erst binden, dann die Fallbedingung prüfen
Ein Bindungsmuster ist ein einfacher Name wie n. Es akzeptiert jedes Vergleichsobjekt und weist es dem Namen zu. Eine Fallbedingung folgt dem Muster mit if condition; der Körper wird nur ausgeführt, wenn das Muster passt und die Fallbedingung wahr ist.
temperature = -5
match temperature:
case 0:
print("Exactly freezing")
case t if t < 0:
print("Below freezing by", -t, "degrees")
case _:
print("Above freezing")
Bei -5 passt das erste Literal nicht. Das nächste Muster bindet -5 an t und prüft dann t < 0. Die Fallbedingung ist wahr, daher lautet die Ausgabe Below freezing by 5 degrees.
Bei 0 gewinnt der Literalfall, bevor die Bindung versucht wird. Bei 12 gelingt die Bindung, aber die Fallbedingung ist falsch, daher probiert Python den Platzhalter und gibt Above freezing aus. Eine nicht erfüllte Fallbedingung beendet die Suche nach einem passenden Fall nicht.
Ein einfacher Name schlägt keine Konstante nach
Angenommen, QUIT = "q". Es liegt nahe, case QUIT: zu schreiben, um zu prüfen, ob das Vergleichsobjekt diesem Wert gleich ist. Ein einfacher Name ist aber immer eine Bindung, auch wenn er großgeschrieben ist. Der Fall akzeptiert jedes Vergleichsobjekt und überschreibt QUIT damit.
Folgen einer Bindung ohne Fallbedingung weitere Fälle, meldet Python einen Syntaxfehler, weil die Bindung sie unerreichbar macht. Steht die Bindung am Ende, kann der Fehler unbemerkt bleiben. Vergleiche ausdrücklich mit einer Fallbedingung:
QUIT = "q"
key = "x"
match key:
case k if k == QUIT:
print("Quit")
case _:
print("Keep working")
Hier bindet k den Wert "x". Die Fallbedingung vergleicht ihn mit dem vorhandenen "q", ist nicht erfüllt und überlässt dem Platzhalter die Ausgabe Keep working. Ein Literal case "q": ist einfacher, wenn sich der feste Wert direkt hinschreiben lässt.
Erkenne ein Wertmuster mit Punkt
Ein Name mit Punkt wie math.pi ist ein Wertmuster, keine Bindung. Es schlägt einen vorhandenen Wert nach und vergleicht das Vergleichsobjekt mit == damit. Benannte Konstanten aus Modulen oder Klassen lassen sich in dieser Form verwenden. Der entscheidende Unterschied ist der Punkt: case n: weist einem Namen einen Wert zu; ein Muster mit Punkt prüft einen vorhandenen Wert.
Benenne einen erfolgreichen spezifischen Treffer mit as
answer = "y"
match answer:
case "y" | "yes" as accepted:
print("Accepted:", accepted)
case _:
print("Please answer y or yes")
Das Oder-Muster prüft die erlaubten Zeichenketten, und as speichert das passende Vergleichsobjekt in accepted. Für "y" lautet die Ausgabe Accepted: y. Die Eingabe wird nicht durch ein Standardwort ersetzt: "yes" würde "yes" speichern. "Yes" passt auf keine der beiden Zeichenketten, weil die Groß- und Kleinschreibung weiterhin zählt.
Ein oder zwei Fallbedingungen fügen sich gut zwischen feste Fälle ein. Ist fast jeder Fall eine Bereichsprüfung oder betrifft er verschiedene Variablen, ist eine if–elif-Kette meist übersichtlicher. Beide Strukturen brauchen am Ende einen Auffangfall, wenn jede Eingabe eine Reaktion erhalten muss.
Wichtige Erkenntnisse
- Ein Muster aus einem einfachen Namen bindet das Vergleichsobjekt, auch wenn dieser Name bereits einen Wert hat.
- Eine Fallbedingung wird geprüft, nachdem ein Muster passt; ist sie falsch, werden die späteren Fälle probiert.
- Ein Wertmuster mit Punkt vergleicht mit einem vorhandenen Wert.
asbenennt das Vergleichsobjekt, das ein spezifischeres Muster akzeptiert hat.- Verwende ein Literal oder einen Vergleich in einer Fallbedingung, damit ein Konstantenname nicht versehentlich bindet.
Bedingungen in Python: Beispiele
1Werte in zuverlässige Vergleiche verwandeln
13 Schritte
- 1EinführungEine Gewichtsgrenze braucht eine genaue Prüfung
Ein Schließfach nimmt Pakete mit einem Gewicht von 1 bis 8 Kilogramm an, beide Grenzen eingeschlossen. Bevor das Programm eine Aktion wählt, muss es diese Regel in eine Ja-Nein-Antwort übersetzen, einen booleschen Wert, der durch einen Vergleich entsteht, sodass jede spätere Entscheidung auf einem exakten Test beruht.
Beginne mit einzelnen Vergleichen und kombiniere dann die beiden Ränder zu einem Bereich. Prüfe dabei, ob ein Wert eine Zahl ist oder nur Text, der wie eine Zahl aussieht.
- 2ErklärungEin Vergleich liefert einen booleschen Wert
Mit
weight = 8ergibt der Ausdruckweight < 8den WertFalse: Acht ist nicht kleiner als acht. Der Ausdruckweight <= 8ergibtTrue, weil er Gleichheit einschließt.Beide Ergebnisse haben den Datentyp
bool. SchreibeTrueundFalsemit großem Anfangsbuchstaben und ohne Anführungszeichen. Text wie"True"ist eine Zeichenkette, und ein undefiniertes kleingeschriebenestruelöst einenNameErroraus, statt einen booleschen Wert zu liefern. - 3BeispielDas Ergebnis speichern, ohne das Gewicht zu ändern
weight = 8 fits_upper_limit = weight <= 8 print(weight, fits_upper_limit)Zuerst ergibt
8 <= 8den WertTrue. Die Zuweisung speichert diesen booleschen Wert infits_upper_limit; das Gewicht selbst bleibt unverändert. Die Ausgabe ist8 True.Das einfache
=führt die Zuweisung aus. Der Vergleich verwendet<=; für die Frage, ob Werte gleich sind, verwendest du==. - 4HerausforderungÄndert ein Vergleich den Wert?
Sage die Ausgabe voraus:
weight = 6 weight == 8 print(weight)---reveal---
Es wird
6ausgegeben. Die mittlere Zeile vergleicht das aktuelle Gewicht mit 8, weist aber nie einen neuen Wert zu. In einem Skript wird ihr falsches Ergebnis nicht verwendet. Eine einzelne Zuweisungweight = 8würde die abschließende Ausgabe in8ändern. - 5VerbindungRechnungen können den Vergleichswert liefern
Ein Test für ganze Zahlen kann ein Rechenergebnis vergleichen:
n % 2 == 0bestimmt zuerst den Rest bei der Division durch 2 und prüft dann, ob er gleich null ist.Für
n = -9ist der Rest1, daher ist der Test falsch. Mit dem positiven Divisor 2 liefert Python für ungerade ganze Zahlen den Rest1, auch wenn die Zahl negativ ist. Vergleichst du den Rest mit1, prüfst du, ob eine Zahl ungerade ist. - 6TippBerechnete Gleitkommazahlen können leicht voneinander abweichen
0.1 + 0.2wird als0.30000000000000004gespeichert, daher schlägt der Test auf exakte Gleichheit mit0.3fehl.Eine Toleranzprüfung stellt eine andere Frage:
abs((0.1 + 0.2) - 0.3) < 1e-9prüft, ob der Abstand kleiner als ein Milliardstel ist.abs()entfernt das Vorzeichen der Differenz. Dieser Test ist wahr; er lässt eine winzige Abweichung zu, statt exakte Gleichheit zu behaupten. - 7BeispielEingetippte Ziffern sind zunächst Text
weight = input("Weight in kilograms: ")Tippt jemand
8ein, enthält die Variable"8". Der Vergleichweight <= 8löst einenTypeErroraus, weil er eine Zeichenkette und eine ganze Zahl der Größe nach vergleichen will.Lies einen Messwert mit Nachkommastellen mit
weight = float(input("Weight in kilograms: "))ein. Dieselben eingetippten Ziffern ergeben jetzt8.0, das sich als Zahl mit8vergleichen lässt. - 8ErklärungZeichenketten werden Zeichen für Zeichen von links verglichen
Die Reihenfolge von Texten beruht auf Unicode-Codepunkten.
"18" < "8"ist wahr, weil das erste ungleiche Zeichenpaar"1"und"8"ist; Python behandelt diese Zeichenketten nicht als achtzehn und acht.Auch Groß- und Kleinschreibung und Leerzeichen zählen.
"ready" == "Ready"ist falsch. Ein Vergleich vonanswer.strip().lower()mit"ready"entfernt Leerraumzeichen am Rand und vereinheitlicht die Groß- und Kleinschreibung vor dem Gleichheitstest. - 9HerausforderungPrüfe, was die Zugehörigkeitsprüfung wirklich fragt
Werte diese beiden Tests aus:
"box" in "mailbox" "Box" in "mailbox"---reveal---
Der erste ergibt
True, der zweiteFalse. Die Zugehörigkeitsprüfung sucht nach der exakten Teilzeichenkette, einschließlich Groß- und Kleinschreibung. Die Buchstaben"box"stehen zusammen am Ende von"mailbox"; das große"B"kommt dort nicht vor.not inwürde jedes Ergebnis umkehren. - 10BeispielPrüfe beide Enden der Schließfachregel
weight = 8 fits_locker = 1 <= weight <= 8 print(fits_locker)Die Kette prüft
1 <= 8und8 <= 8. Beide Prüfungen sind erfüllt, daher ist das ErgebnisTrue. Beiweight = 0.5schlägt der untere Test fehl, bei8.5der obere.Jeder benachbarte Vergleich einer Kette muss erfüllt sein. Ersetzt du eines der beiden
<=durch<, schließt du diesen Endpunkt aus. - 11KernaussageFehlende Daten sind eine andere Frage
Nonebedeutet, dass kein Wert vorhanden ist. Prüfe es mitweight is Noneoderweight is not None.Der Operator
isfragt, ob Referenzen dasselbe Objekt bezeichnen. Für die Gleichheit von Zahlen dient==; ersetze alsoweight == 8nicht durchweight is 8. Werte können gleich sein, ohne dasselbe Objekt zu sein, und ein Identitätsvergleich mit einem Zahlenliteral erzeugt eine Warnung. - 12HerausforderungUmwandlung und Grenzprüfung kombinieren
Ein Skript führt
weight = float(input("Weight: "))aus, und jemand tippt"8.5"ein. Was liefert1 <= weight <= 8, und weist schon die Umwandlung die Eingabe zurück?---reveal---
Es liefert
False, weil8.5 <= 8nicht erfüllt ist. Die Umwandlung gelingt: 8,5 ist eine gültige Gleitkommazahl. Die Umwandlung des Textes stellt einen Zahlentyp her; der Bereichstest entscheidet getrennt davon, ob diese Zahl zulässig ist. - 13ZusammenfassungDrei Fragen, die du auseinanderhalten solltest
Wähle den Operator passend zur Grenze, stelle den Datentyp des Werts sicher und vollziehe dann den Vergleich nach.
Für Größenvergleiche von Zahlen brauchst du Zahlenwerte. Prüfungen von Zeichenketten berücksichtigen die exakten Zeichen, sofern du den Text nicht bereinigst. Ein Bereich braucht beide Ränder, die Zugehörigkeitsprüfung fragt nach einer Teilzeichenkette, und die Identitätsprüfung ist das richtige Werkzeug für die Prüfung auf
None.
2Eine Versandentscheidung durch ihre Zweige verfolgen
14 Schritte
Speichere diese Einheit, um jede Interaktive Lektion Schritt für Schritt durchzugehen.
- 1EinführungVon einer Regel zu einem Pfad durch den Code
- 2BeispielEine Warnung, die übersprungen werden kann
- 3TippErst den Aufbau korrigieren, dann die Ergebnisse deuten
- 4HerausforderungDie letzte Zeile in den Körper verschieben
- 5BeispielDem False-Pfad eine Aktion geben
- 6Kernaussageelse bedeutet: jede abgelehnte Eingabe
- 7BeispielNur die Gebühr in einem Ausdruck wählen
- 8HerausforderungLies die Werte rund um die Bedingung
- 9BeispielDrei Servicestufen anlegen
- 10BeispielDen Bereich mit der früheren fehlgeschlagenen Prüfung eingrenzen
- 11HerausforderungDie Reihenfolge sich überschneidender Prüfungen ändern
- 12VerbindungEin neues if ist eine neue Entscheidung
- 13HerausforderungBezeichnung und Gebühr bestimmen
- 14ZusammenfassungDie Struktur passend zur Wahl wählen
3Eine kombinierte Bedingung aufbauen und absichern
13 Schritte
Speichere diese Einheit, um jede Interaktive Lektion Schritt für Schritt durchzugehen.
- 1EinführungMehrere Tatsachen können eine Aktion steuern
- 2ErklärungMit and beide Tatsachen verlangen
- 3BeispielMit or eine der beiden Zahlungsarten zulassen
- 4HerausforderungWähle eine Zeile, die die Prüfung besteht
- 5TippGib jedem Vergleich eigene Operanden
- 6BeispielAlternativen in die gemeinsame Anforderung setzen
- 7KernaussageGruppierung ist nicht die Ausführungsreihenfolge
- 8BeispielEine Schutzbedingung vor die Berechnung des arithmetischen Mittels setzen
- 9HerausforderungWelche Teile werden erreicht?
- 10ErklärungBeim Verneinen eines Bereichs ändert sich der Verknüpfungsoperator
- 11HerausforderungEingeschlossene Endpunkte beibehalten
- 12HerausforderungZwei Anforderungen und einen Ausschluss übersetzen
- 13ZusammenfassungBedeutung, Gruppierung, dann erreichte Teile lesen
4Einen Lieferauftrag validieren, einordnen und testen
16 Schritte
Speichere diese Einheit, um jede Interaktive Lektion Schritt für Schritt durchzugehen.
- 1EinführungJede Eingabe braucht den beabsichtigten Pfad
- 2BeispielValidieren, bevor ein Service gewählt wird
- 3BeispielDen inneren Pfad nachvollziehen
- 4HerausforderungFinde heraus, zu welchem if das else gehört
- 5VerbindungAbflachen, wenn es eine gemeinsame Aktion gibt
- 6ErklärungNull und fehlende Werte werden beide als falsch ausgewertet
- 7BeispielText, der nach Nein aussieht, kann trotzdem bestehen
- 8HerausforderungEine echte Null erhalten
- 9KernaussageEin Operator kann Text auswählen
- 10BeispielEinen Pfad festhalten, ohne Tests zu erfinden
- 11TippTests für Pfade und Grenzen wählen
- 12HerausforderungEine weit gefasste Bedingung verdeckt einen späteren Zweig
- 13VerbindungNach Lücken und unbeabsichtigten Überschneidungen suchen
- 14TippDen Wert vor einem riskanten Vergleich untersuchen
- 15HerausforderungEine korrigierte Entscheidung vollständig testen
- 16ZusammenfassungWerten und Tests einen klaren Zweck geben
5Befehle abgleichen und Fälle mit Fallbedingungen ergänzen
15 Schritte
Speichere diese Einheit, um jede Interaktive Lektion Schritt für Schritt durchzugehen.
- 1EinführungEin Vergleichsobjekt, mehrere mögliche Fälle
- 2BeispielDas Befehlsmenü anlegen
- 3KernaussageDer nächste Fall wird nicht automatisch ausgeführt
- 4BeispielEinen Körper für zwei exakte Befehle verwenden
- 5HerausforderungDen Auffangfall an die richtige Stelle setzen
- 6TippDas Verhalten von Zahlen- und booleschen Mustern prüfen
- 7ErklärungEin einfacher Name bindet jedes Vergleichsobjekt
- 8BeispielDen gebundenen Wert mit einer Fallbedingung prüfen
- 9HerausforderungNach einer falschen Fallbedingung weitermachen
- 10BeispielAuch ein großgeschriebener Name bindet
- 11VerbindungEin Punkt ändert das Nachschlageverhalten
- 12BeispielEine passende Literalalternative benennen
- 13HerausforderungDie passende Menüstruktur für die Aufgabe wählen
- 14HerausforderungEinen festen Namen bewahren und einen Auffangfall zulassen
- 15ZusammenfassungMuster lesen, bevor du die Fallkörper liest
Bedingungen in Python: Übungsaufgaben
Set 1: Vergleiche lesen und Entscheidungen verfolgen10 Übungsfragen
Frage 1 von 10
weight akzeptiert genau die zulässigen Gewichte?Antwort zeigenAntwort ausblenden
weight <= 6 die 6 ebenso wie kleinere Gewichte. Der strenge Test weight < 6 lehnt ein Paket ab, das genau an der zulässigen Grenze liegt. Außerdem muss die Richtung kleinere Gewichte akzeptieren; ein Größer-als-Test kehrt die Regel daher um.Frage 2 von 10
"14" < "7"?Antwort zeigenAntwort ausblenden
"1" kommt vor "7", sodass dieser Vergleich wahr ist, ohne dass die Zahlenwerte 14 und 7 verglichen werden. Die Deutung als Zahlen würde erst gelten, nachdem die Zeichenketten in Zahlen umgewandelt wurden.Frage 3 von 10
Was wird ausgegeben?
stock = 0
if stock > 0:
print("Available")
print("Checked")
Antwort zeigenAntwort ausblenden
0 > 0 ist falsch, daher überspringt Python die eingerückte Ausgabe. Die letzte Ausgabe steht außerhalb des Körpers und wird trotzdem ausgeführt; sie erzeugt Checked. Wer annimmt, dass gar nichts ausgegeben wird, behandelt diese nicht eingerückte Anweisung fälschlich als Teil des Körpers der Verzweigung.Frage 4 von 10
Welcher Wert wird fee zugewiesen?
has_pass = False
fee = 2 if has_pass else 7
Antwort zeigenAntwort ausblenden
has_pass falsch, daher wird fee zu 7. Wer 2 wählt, hält den zuerst geschriebenen Wert für den Standardwert, statt ihn als den Wert für eine wahre Bedingung zu erkennen.Frage 5 von 10
Was wird ausgegeben?
points = 46
if points >= 50:
print("Gold")
elif points >= 30:
print("Silver")
elif points >= 10:
print("Bronze")
else:
print("Starter")
Antwort zeigenAntwort ausblenden
Silver aus und verlässt die Kette. Obwohl 46 auch die Bronze-Schwelle erreicht, wird diese spätere Bedingung übersprungen; eine Kette führt nicht jeden Körper aus, dessen Bedingung wahr sein könnte.Frage 6 von 10
Antwort zeigenAntwort ausblenden
or akzeptiert ein Abonnement, einen Tagespass oder beides und lehnt nur den Fall ab, in dem keines von beiden vorliegt. Mit and wären beide Zugangsarten gleichzeitig erforderlich. Die Regel nennt Alternativen, die den Download jeweils für sich erlauben; diese zusätzliche Anforderung würde also berechtigte Personen abweisen.Frage 7 von 10
total und items soll eine Merkvariable nur dann wahr sein, wenn das arithmetische Mittel größer als 8 ist. Bei null Elementen muss sich falsch ergeben, ohne dass eine Division versucht wird. Welcher Ausdruck erfüllt beide Anforderungen?Antwort zeigenAntwort ausblenden
and stehen, damit die Auswertung bei null Elementen vor der Division abbricht und falsch ergibt. Bei einer Anzahl ungleich null wertet Python den Test auf das arithmetische Mittel aus. Steht die Division zuerst, schlägt sie bei null fehl; mit or wird entweder null akzeptiert oder der Test auf das Mittel bei Anzahlen ungleich null übersprungen.Frage 8 von 10
bool("no") zurück?Antwort zeigenAntwort ausblenden
"no" enthält Zeichen, daher ist ihr Wahrheitswert wahr. bool() wandelt diese Wahrheitswertauswertung in den booleschen Wert True um; das Wort wird nicht als Ablehnung gedeutet. Wer falsch erwartet, verwechselt eine nicht leere Zeichenkette mit einer booleschen Antwort auf ihre Bedeutung.Frage 9 von 10
visits ab 24 akzeptieren. Jemand hat visits > 24 geschrieben. Welche Eingabe deckt das falsche Ergebnis am direktesten auf?Antwort zeigenAntwort ausblenden
>= 24 und > 24 gleich, daher würde jede von ihnen allein diesen Fehler übersehen. Erst der Test genau an der Grenze unterscheidet die beiden Operatoren.Frage 10 von 10
Was wird ausgegeben?
mode = "SAVE"
match mode:
case "save" | "write":
print("Stored")
case _:
print("Unknown")
print("End")
Antwort zeigenAntwort ausblenden
"SAVE" ist keinem der beiden kleingeschriebenen Literale gleich, weil der Abgleich von Zeichenketten die Groß- und Kleinschreibung beachtet. Der Platzhalter gibt Unknown aus, und die Zeile nach der match-Anweisung gibt End aus. Wer Stored erwartet, nimmt an, dass der Musterabgleich die Groß- und Kleinschreibung automatisch vereinheitlicht.Set 2: Regeln anwenden und falsche Zweige diagnostizieren10 Übungsfragen
Speichere diese Einheit, um jede Antwort zu sehen und jedes Set zu üben.
Frage 1 von 10
Welcher boolesche Wert wird in is_odd gespeichert?
n = -13
is_odd = n % 2 == 1
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 2 von 10
level = input("Level: ") ein. Eingetippt wird 16. Was passiert, wenn das Programm danach level < 20 auswertet?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 3 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 4 von 10
Welchen Endwert hat label?
points = 37
if points >= 30:
label = "High"
if points >= 10:
label = "Middle"
else:
label = "Low"
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 5 von 10
is_open and not is_full wahr?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 6 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 7 von 10
Was wird ausgegeben?
is_open = False
has_booking = True
if is_open:
if has_booking:
print("Enter")
else:
print("Book first")
else:
print("Closed")
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 8 von 10
"" or "Reader" zurück?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 9 von 10
"edit" und "change" beide in denselben Körper?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 10 von 10
Was wird ausgegeben?
value = 11
match value:
case n if n < 0:
print("Negative", n)
case n if n % 2 == 0:
print("Even", n)
case _:
print("Other")
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Set 3: Werte durch mehrere Entscheidungen verfolgen10 Übungsfragen
Speichere diese Einheit, um jede Antwort zu sehen und jedes Set zu üben.
Frage 1 von 10
a = 0.1 + 0.2, und ein Zielwert ist b = 0.3. Die Prüfung muss Abweichungen akzeptieren, die kleiner als 1e-8 sind. Welcher Test setzt das um?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 2 von 10
Was wird ausgegeben?
remaining = 4
if remaining > 0:
remaining = 0
if remaining == 0:
print("Empty")
print(remaining)
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 3 von 10
Welcher Wert wird label zugewiesen?
has_booking = True
label = "Reserved" if has_booking else "Open"
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 4 von 10
Was passiert, wenn dieser Ausdruck ausgewertet wird?
is_admin = True
count = 0
total = 18
is_admin or count != 0 and total / count > 6
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 5 von 10
Was wird ausgegeben, und warum?
has_badge = True
is_active = False
if has_badge:
if is_active:
print("Enter")
else:
print("Get a badge")
print("Checked")
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 6 von 10
None bedeutet, dass keine Anzahl angegeben wurde. Welche Zuweisung verwendet den Standardwert 9 nur für fehlende Daten?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 7 von 10
Diese Einordnung ganzer Zahlen soll für jede ganze Zahl genau eine Vorzeichenbezeichnung ausgeben. Welche Eingabe deckt einen fehlenden Fall auf?
if balance < 0:
print("Negative")
elif balance > 0:
print("Positive")
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 8 von 10
Was wird ausgegeben?
reply = "later"
match reply:
case "now" | "later" as chosen:
print(chosen)
case _:
print("Unknown")
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 9 von 10
not (-4 <= reading <= 9)?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 10 von 10
Was passiert mit EXIT?
EXIT = "x"
key = "z"
match key:
case EXIT:
print(EXIT)
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Set 4: Kombinierte Entscheidungsregeln reparieren und testen10 Übungsfragen
Speichere diese Einheit, um jede Antwort zu sehen und jedes Set zu üben.
Frage 1 von 10
"go" trotz Leerraumzeichen am Rand und Unterschieden in der Groß- und Kleinschreibung. Sie muss "gopher" und "stop" ablehnen. Welche Bedingung setzt das um?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 2 von 10
Was wird ausgegeben?
units = 0
amount = 15
result = amount / units if units != 0 else "No units"
print(result)
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 3 von 10
"High" ab 70 Punkten, "Mid" für 35 bis 69 und "Low" unter 35. Die Prüfungen verwenden >= in einer einzigen Kette. Welche Reihenfolge der Zweige und welche Bezeichnungen setzen die Regel um?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 4 von 10
wired und wireless, verfügbar ist und keine Wartung läuft. Welche Bedingung setzt die gesamte Regel um?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 5 von 10
"High", andere gültige Punktzahlen "Low" und ungültige Punktzahlen "Invalid". Ein Skript ordnet mit if score >= 9: und else: ein, prüft aber nie den Bereich. Welche Struktur repariert es für jede ganzzahlige Punktzahl?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 6 von 10
Welcher Wert wird in chosen gespeichert?
preferred = ""
alternate = "Morgan"
chosen = preferred or alternate or "Visitor"
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 7 von 10
Bei ganzzahligen Punktzahlen soll eine Einordnung "Top" ab 80 verwenden, "Pass" für 40 bis 79 und "Retry" unter 40. Welche Testeingabe deckt einen Fehler in diesem Code auf?
if score >= 40:
print("Pass")
elif score >= 80:
print("Top")
else:
print("Retry")
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 8 von 10
Was wird ausgegeben?
value = True
match value:
case 1:
print("Number case")
case True:
print("Boolean case")
case _:
print("Other case")
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 9 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 10 von 10
case n ___ n > 4: die zusätzliche Bedingung nach einem Muster ein?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Hängst du bei deiner eigenen Aufgabe fest? Hausaufgabenhilfe
Schlüsselbegriffe
A
Abflachung
and-Bedingung die Verschachtelung ersetzen.Ablauftabelle
als falsch ausgewerteter Wert
None, False, leerer Text und leere eingebaute Sammlungen.quantity or 1 den Standardwert, auch wenn null absichtlich eingegeben wurde.als wahr ausgewerteter Wert
"False" erfüllt if answer:, weil seine Zeichen die Zeichenkette nicht leer machen.as-Muster
case "y" | "yes" as reply: speichert "y", wenn genau diese Zeichenkette angegeben wurde.Auffangzweig
else in einer mehrseitigen Verzweigung."1" oder "2" den Text "Unknown option" ausgeben.Ä
äquivalente Bedingungen
not (age >= 18) und age < 18 stimmen für jedes ganzzahlige Alter überein.äußere Bedingung
has_ticket falsch, wird der innere Altersvergleich übersprungen.B
bedingter Ausdruck
a if condition else b einen von zwei Werten aus, liefert ihn und wertet nur den gewählten Wert aus.fee = 0 if has_pass else 4 speichert 4, wenn kein Pass vorhanden ist.Bindungsmuster
case STOP: überschreibt STOP; die Großschreibung macht daraus kein Nachschlagen.Block
print()-Aufrufe unter einer Temperaturprüfung gehören zu dem Block, den die Prüfung steuert.boolescher Operator
and, or und not.has_ticket and is_open die beiden Anforderungen zu einer Prüfung.boolescher Wert
True und False, mit denen Python das Ergebnis einer Ja-Nein-Prüfung ausdrückt.is_ready = count >= 4 speichert, ist True, wenn count gleich 4 ist.D
de Morgansche Gesetze
and und or gegeneinander austauschen; der Wahrheitswert bleibt dabei erhalten.not (A or B) den Ausdruck not A and not B, in dem beide Teile umgekehrt sind.E
Eingabevalidierung
0 <= score <= 100 weist 150 zurück, bevor eine Note vergeben werden kann.eingeschlossene Grenze
<= oder >= ausgedrückt.age >= 18 lässt eine Person, die genau 18 ist, die Prüfung bestehen.Einrückung
print("Done") in einem if-Rumpf eine Einrückungsebene, wird die Zeile nach der ganzen Entscheidung ausgeführt.einschließendes Oder
or von Python hat diese Bedeutung.is_member or has_coupon erfüllt, wenn sowohl eine Mitgliedschaft als auch ein Gutschein vorliegen.elif-Klausel
if-Kette um einen weiteren Zweig mit Bedingung und wird erst berücksichtigt, wenn alle früheren Bedingungen falsch waren.else-Zweig
if falsch ist; die Kopfzeile else: hat keine Bedingung.if-Test auf gerade Zahlen wird der else-Zweig für -7 ausgeführt, weil der Rest nicht null ist.F
Fallbedingung (Guard)
if-Bedingung nach einem Muster, die erfüllt sein muss, bevor der Körper ausgeführt wird; ist sie falsch, werden die späteren Fälle probiert.case n if n < 0: prüft die gebundene Zahl, bevor der Fall für negative Zahlen gewählt wird.G
Grenzwerttest
age >= 18 geschrieben ist.I
Identitätsprüfung
is oder is not, ob Referenzen dasselbe Objekt bezeichnen; meist dient sie dazu, None zu erkennen.result is None unterscheidet ein fehlendes Ergebnis von einem echten Wert null.if-Anweisung
if stock > 0: überspringt ihren Körper, wenn stock null ist.K
Konjunktion
and verknüpfte Bedingung, die nur erfüllt ist, wenn beide Anforderungen erfüllt sind, etwa die beiden Ränder eines Bereichs.age >= 13 and age <= 19 lehnt Alterswerte auf beiden Seiten des Teenageralters ab.Kurzschlussauswertung
total / count, wenn die mit and verknüpfte Prüfung count != 0 falsch ist.L
Literalmuster
None; Zahlen- und Zeichenkettenliterale werden auf Gleichheit verglichen.case 6: akzeptiert die Zahl 6, lehnt aber den Text "6" ab, den eine Eingabe liefert.M
match-Anweisung
"stop" überspringt case "start": und führt den Körper unter case "stop": aus.O
Oder-Muster
| und ist erfolgreich, wenn eine der Alternativen passt; alle teilen sich einen Fallkörper.case "open" | "load": führt für beide Befehle denselben Körper aus.Operand
and und or geben einen ihrer Operanden zurück statt immer einen booleschen Wert."" or "Guest" wird als falsch ausgewertet, daher gibt der Ausdruck den rechten Operanden zurück.Operatorvorrang
and vor or gruppiert.A or B and C als A or (B and C) gelesen, sofern runde Klammern nichts anderes festlegen.P
pass-Anweisung
if-Körper gültig, ohne eine Ausgabe zu erzeugen.Platzhaltermuster
_; es akzeptiert jedes Vergleichsobjekt, ohne ihm einen Namen zu geben, und muss ohne Fallbedingung als letzter Fall stehen."Unknown command" aus, wenn die früheren festen Befehlsmuster nicht passen.Programmablaufplan (Flussdiagramm)
Pseudocode
R
Regel des ersten zutreffenden Falls
>= 60 erfasst, wenn diese weit gefasste Prüfung zuerst steht.S
Schutzbedingung
count != 0 and total / count > 10 zuerst count != 0 und erst dann die Division.Schwellenwert
score >= 90 lautet.Standardwert
or-Ausdruck auswählt."Guest" wird in name or "Guest" gewählt, wenn name die leere Zeichenkette ist.T
Toleranz
1e-9 lässt abs(a - b) < 1e-9 eine winzige Abweichung zwischen berechneten Gleitkommazahlen akzeptieren.Typumwandlung
int() in eine ganze Zahl umgewandelt werden.level = int(input("Level: ")) ermöglicht eine Prüfung gegen eine Zahlengrenze.U
unerreichbarer Zweig
elif score >= 90: auf das weiter gefasste if score >= 60: folgt.Unicode-Codepunkt
"Z" ist kleiner als der von "a", daher ist "Zebra" < "apple" wahr.V
Vergleich mit Beachtung der Groß- und Kleinschreibung
"Yes" ab, wenn genau der Text "yes" verlangt ist.Vergleichsobjekt
match.match command: ist der aktuelle Wert von command das Vergleichsobjekt für jeden Abgleich.Vergleichsoperator
<=, das eine Grenze einschließt.weight <= 8 akzeptiert ein Gewicht von genau 8 Kilogramm.verketteter Vergleich
2 <= level <= 9 schließt 2 und 9 ein, lehnt aber den Wert 10 ab.verschachtelte Verzweigung
W
Wahrheitstabelle
Wahrheitswertauswertung (Truthiness)
if name: eine leere Antwort ab, ohne ausdrücklich mit "" zu vergleichen.Wertmuster
math.pi vergleicht mit einem vorhandenen Wert aus einem Modul, statt einem einfachen Namen etwas zuzuweisen.Z
Zugehörigkeitsoperator
in und not in auf exakte Teilzeichenketten."rain" in "raincoat" findet den Text und liefert True.Zuweisung
= einen Wert unter einem Variablennamen und ersetzt dabei einen Wert, der diesem Namen bereits zugeordnet war.score = 28 ändert score; score == 28 vergleicht nur den aktuellen Wert.Zweigüberdeckung
zweiseitige Verzweigung
if und else genau einen von zwei Pfaden, mit einem Körper für jeden der beiden Wahrheitswerte.Über diese Einheit
Erstelle deine eigenen Lernmaterialien
Mach aus deinen Notizen, Folien und Dokumenten Lernleitfäden, Übungsfragen, Karteikarten und 6 weitere Tools.