Bedingungen und boolesche Logik in Python

Lerne, wie ein Python-Programm Entscheidungen trifft. Du vergleichst Zahlen und Texte mit Vergleichsoperatoren, verknüpfst Bedingungen mit 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

  1. Schreibe Vergleiche mit den sechs Vergleichsoperatoren von Python, sage für Zahlen und Texte voraus, ob sie True oder False ergeben, und vermeide die Verwechslungen, durch die eine Bedingung unbemerkt falsch wird.
    • Zahlen mit den sechs Vergleichsoperatoren vergleichen
      Verwende ==, !=, <, <=, > und >=, um Zahlen zu vergleichen, lies jedes Ergebnis als booleschen Wert und unterscheide den Vergleich von der Zuweisung.
    • Texte, unterschiedliche Datentypen und Wertebereiche vergleichen
      Vergleiche Zeichenketten exakt und nach alphabetischer Reihenfolge, wandle eingegebenen Text vor dem Vergleich mit Zahlen um und prüfe Wertebereiche, Zugehörigkeit und None mit dem passenden Operator.
  2. 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 ist
      Schreibe 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ählen
      Ergä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ählen
      Baue 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.
  3. Verknüpfe und verneine Bedingungen mit and, or und not, 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 verneinen
      Sage die Ergebnisse von and, or und not mit Wahrheitstabellen voraus, übersetze Alltagsregeln in kombinierte Bedingungen und vermeide den klassischen Fehler mit or.
    • Vorhersagen, wie Python längere Bedingungen auswertet
      Wende Operatorvorrang und Kurzschlussauswertung an, setze runde Klammern, die die beabsichtigte Gruppierung deutlich machen, und formuliere verneinte Bedingungen mit den de Morganschen Gesetzen um.
  4. 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 verschachteln
      Setze 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, wenn and oder elif dasselbe einfacher ausdrückt.
    • Werte direkt anhand ihrer Wahrheitswertauswertung prüfen
      Sage 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 testen
      Vollziehe 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.
  5. Verwende die match-Anweisung von Python, um einen Wert mit mehreren Mustern zu vergleichen, Werte zu binden und Fallbedingungen hinzuzufügen, und entscheide, wann match übersichtlicher ist als eine if–elif-Kette.
    • Einen Wert mit festen Fällen abgleichen
      Schreibe 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 versehen
      Verwende Bindungsmuster und as, um dem passenden Wert einen Namen zu geben, ergänze Fallbedingungen mit if für Bedingungen, die ein Literal nicht ausdrücken kann, und vermeide die Falle, dass ein Variablenname in einem Fall auf alles passt.

Bedingungen in Python einfach erklärt

5 Kapitel

1

Vergleiche, 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
OperatorFrageMit 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 True und False.
  • = 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.

RegelPython-Test
Von 1 bis 10, beide Enden eingeschlossen1 <= x <= 10
Echt zwischen 1 und 101 < 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() oder float() um.
  • Bei einem verketteten Bereichstest muss jeder benachbarte Vergleich erfüllt sein.
  • in prüft die Zugehörigkeit; is None prüft auf die Markierung für „kein Wert“.
2

Auswä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.

ProblemWas zu beheben ist
Fehlender DoppelpunktBeende die Kopfzeile mit :.
Kein eingerückter KörperRücke die Zeilen ein, die if steuert.
Uneinheitliche EinrückungRichte Anweisungen, die zum selben Block gehören, bündig aus.
Gemischte Tabulatoren und LeerzeichenStelle 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.
  • pass liefert 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".

BedarfPassende Form
Mehrere Aktionen in einem der ZweigeVollständige if–else-Blöcke
Einer von zwei WertenBedingter 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 seinem if.
  • Ein else erfasst 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 b und 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.

PunktzahlErster erfolgreicher WegNote
90score >= 90A
89score >= 80B
60score >= 60D
59Abschließendes elseF
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 else behandelt Eingaben, die keine der Prüfungen bestehen.
  • Teste genau die Schwellenwerte, um Lücken und Um-eins-Fehler zu finden.
3

Prü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.

ABA and BA or B
TrueTrueTrueTrue
TrueFalseFalseTrue
FalseTrueFalseTrue
FalseFalseFalseFalse

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
BedeutungTest
Innerhalb von 0 bis 100score >= 0 and score <= 100
Außerhalb von 0 bis 100score < 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

  • and verlangt, dass beide booleschen Eingangswerte wahr sind; das einschließende or verlangt mindestens einen.
  • not kehrt einen Wahrheitswert um und liefert immer einen booleschen Wert.
  • Für „innerhalb eines Bereichs“ brauchst du and, für „außerhalb“ brauchst du or.
  • 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:

  1. Potenzierung: **.
  2. Multiplikation, Division, abrundende Division, Rest: *, /, //, %.
  3. Addition und Subtraktion: +, -.
  4. Vergleiche, einschließlich in, not in, is und is not.
  5. not, dann and, dann or.
  6. 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
AusdruckWann Python B überspringt
A and BA wird als falsch ausgewertet
A or BA 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 and und or gegeneinander aus.
  • Mache mit runden Klammern die beabsichtigte Gruppierung sichtbar, wenn du and und or mischst.
  • Prüfe boolesche Variablen direkt mit ihrem Namen oder mit not.
4

Entscheidungen 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 if ein else gehö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.

Wertbool(value)Grund
0, 0.0FalseDie Zahl null
-3TrueZahl ungleich null
""FalseLeere Zeichenkette
" "TrueEnthält ein Leerzeichen
"0", "False", "no"TrueNicht leere Zeichenketten
NoneFalseMarkierung für „kein Wert“
[], (), {}FalseLeere 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:

AusdruckRückgabewert
"" or "Guest""Guest"
"Ana" or "Guest""Ana"
0 and 50
3 and 55

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, None und False werden 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.
  • and und or geben Operanden zurück; not gibt immer einen booleschen Wert zurück.
  • Ein Standardwert mit or ersetzt 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 BedingungErgebnisAktion
score >= 90FalseWeiter zur nächsten Prüfung
score >= 80FalseWeiter zur nächsten Prüfung
score >= 70Truegrade auf "C" setzen
Rest der KetteNicht ausgewertetNach 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.
5

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

EntscheidungNaheliegende erste Wahl
Ein Vergleichsobjekt wird mit vielen festen Werten verglichenmatch
Bereiche wie score >= 90if–elif
Bedingungen mit verschiedenen Variablenif–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

  • match braucht 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, False und None beruhen auf Identität.
  • Passt kein Fall und gibt es keinen Auffangfall, wird kein Körper ausgeführt.
  • Verwende match für feste Auswahlmöglichkeiten und if–elif fü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.
  • as benennt 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

5 Interaktive Lektionen

1

Werte in zuverlässige Vergleiche verwandeln

13 Schritte
Verfolge die Prüfung einer Gewichtsgrenze: von Zahlenvergleichen über eingetippte Eingaben und Textprüfungen bis zu einem Bereich mit eingeschlossenen Grenzen.
  1. 1
    Einfü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.

  2. 2
    ErklärungEin Vergleich liefert einen booleschen Wert

    Mit weight = 8 ergibt der Ausdruck weight < 8 den Wert False: Acht ist nicht kleiner als acht. Der Ausdruck weight <= 8 ergibt True, weil er Gleichheit einschließt.

    Beide Ergebnisse haben den Datentyp bool. Schreibe True und False mit großem Anfangsbuchstaben und ohne Anführungszeichen. Text wie "True" ist eine Zeichenkette, und ein undefiniertes kleingeschriebenes true löst einen NameError aus, statt einen booleschen Wert zu liefern.

  3. 3
    BeispielDas Ergebnis speichern, ohne das Gewicht zu ändern
    weight = 8
    fits_upper_limit = weight <= 8
    print(weight, fits_upper_limit)
    

    Zuerst ergibt 8 <= 8 den Wert True. Die Zuweisung speichert diesen booleschen Wert in fits_upper_limit; das Gewicht selbst bleibt unverändert. Die Ausgabe ist 8 True.

    Das einfache = führt die Zuweisung aus. Der Vergleich verwendet <=; für die Frage, ob Werte gleich sind, verwendest du ==.

  4. 4
    HerausforderungÄndert ein Vergleich den Wert?

    Sage die Ausgabe voraus:

    weight = 6
    weight == 8
    print(weight)
    

    ---reveal---

    Es wird 6 ausgegeben. 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 Zuweisung weight = 8 würde die abschließende Ausgabe in 8 ändern.

  5. 5
    VerbindungRechnungen können den Vergleichswert liefern

    Ein Test für ganze Zahlen kann ein Rechenergebnis vergleichen: n % 2 == 0 bestimmt zuerst den Rest bei der Division durch 2 und prüft dann, ob er gleich null ist.

    Für n = -9 ist der Rest 1, daher ist der Test falsch. Mit dem positiven Divisor 2 liefert Python für ungerade ganze Zahlen den Rest 1, auch wenn die Zahl negativ ist. Vergleichst du den Rest mit 1, prüfst du, ob eine Zahl ungerade ist.

  6. 6
    TippBerechnete Gleitkommazahlen können leicht voneinander abweichen

    0.1 + 0.2 wird als 0.30000000000000004 gespeichert, daher schlägt der Test auf exakte Gleichheit mit 0.3 fehl.

    Eine Toleranzprüfung stellt eine andere Frage: abs((0.1 + 0.2) - 0.3) < 1e-9 prü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.

  7. 7
    BeispielEingetippte Ziffern sind zunächst Text
    weight = input("Weight in kilograms: ")
    

    Tippt jemand 8 ein, enthält die Variable "8". Der Vergleich weight <= 8 löst einen TypeError aus, 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 jetzt 8.0, das sich als Zahl mit 8 vergleichen lässt.

  8. 8
    Erklä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 von answer.strip().lower() mit "ready" entfernt Leerraumzeichen am Rand und vereinheitlicht die Groß- und Kleinschreibung vor dem Gleichheitstest.

  9. 9
    HerausforderungPrü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 zweite False. 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 in würde jedes Ergebnis umkehren.

  10. 10
    BeispielPrüfe beide Enden der Schließfachregel
    weight = 8
    fits_locker = 1 <= weight <= 8
    print(fits_locker)
    

    Die Kette prüft 1 <= 8 und 8 <= 8. Beide Prüfungen sind erfüllt, daher ist das Ergebnis True. Bei weight = 0.5 schlägt der untere Test fehl, bei 8.5 der obere.

    Jeder benachbarte Vergleich einer Kette muss erfüllt sein. Ersetzt du eines der beiden <= durch <, schließt du diesen Endpunkt aus.

  11. 11
    KernaussageFehlende Daten sind eine andere Frage

    None bedeutet, dass kein Wert vorhanden ist. Prüfe es mit weight is None oder weight is not None.

    Der Operator is fragt, ob Referenzen dasselbe Objekt bezeichnen. Für die Gleichheit von Zahlen dient ==; ersetze also weight == 8 nicht durch weight is 8. Werte können gleich sein, ohne dasselbe Objekt zu sein, und ein Identitätsvergleich mit einem Zahlenliteral erzeugt eine Warnung.

  12. 12
    HerausforderungUmwandlung und Grenzprüfung kombinieren

    Ein Skript führt weight = float(input("Weight: ")) aus, und jemand tippt "8.5" ein. Was liefert 1 <= weight <= 8, und weist schon die Umwandlung die Eingabe zurück?

    ---reveal---

    Es liefert False, weil 8.5 <= 8 nicht 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.

  13. 13
    ZusammenfassungDrei 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.

2

Eine Versandentscheidung durch ihre Zweige verfolgen

14 Schritte
Baue eine Versandentscheidung auf: von einem einzelnen if über zwei Alternativen und einen ausgewählten Wert bis zu geordneten Servicestufen.

Speichere diese Einheit, um jede Interaktive Lektion Schritt für Schritt durchzugehen.

  1. 1
    EinführungVon einer Regel zu einem Pfad durch den Code
  2. 2
    BeispielEine Warnung, die übersprungen werden kann
  3. 3
    TippErst den Aufbau korrigieren, dann die Ergebnisse deuten
  4. 4
    HerausforderungDie letzte Zeile in den Körper verschieben
  5. 5
    BeispielDem False-Pfad eine Aktion geben
  6. 6
    Kernaussageelse bedeutet: jede abgelehnte Eingabe
  7. 7
    BeispielNur die Gebühr in einem Ausdruck wählen
  8. 8
    HerausforderungLies die Werte rund um die Bedingung
  9. 9
    BeispielDrei Servicestufen anlegen
  10. 10
    BeispielDen Bereich mit der früheren fehlgeschlagenen Prüfung eingrenzen
  11. 11
    HerausforderungDie Reihenfolge sich überschneidender Prüfungen ändern
  12. 12
    VerbindungEin neues if ist eine neue Entscheidung
  13. 13
    HerausforderungBezeichnung und Gebühr bestimmen
  14. 14
    ZusammenfassungDie Struktur passend zur Wahl wählen
3

Eine kombinierte Bedingung aufbauen und absichern

13 Schritte
Übersetze eine Buchungsregel, gruppiere Alternativen, setze Schutzbedingungen mit Kurzschlussauswertung ein und verneine einen Bereich korrekt.

Speichere diese Einheit, um jede Interaktive Lektion Schritt für Schritt durchzugehen.

  1. 1
    EinführungMehrere Tatsachen können eine Aktion steuern
  2. 2
    ErklärungMit and beide Tatsachen verlangen
  3. 3
    BeispielMit or eine der beiden Zahlungsarten zulassen
  4. 4
    HerausforderungWähle eine Zeile, die die Prüfung besteht
  5. 5
    TippGib jedem Vergleich eigene Operanden
  6. 6
    BeispielAlternativen in die gemeinsame Anforderung setzen
  7. 7
    KernaussageGruppierung ist nicht die Ausführungsreihenfolge
  8. 8
    BeispielEine Schutzbedingung vor die Berechnung des arithmetischen Mittels setzen
  9. 9
    HerausforderungWelche Teile werden erreicht?
  10. 10
    ErklärungBeim Verneinen eines Bereichs ändert sich der Verknüpfungsoperator
  11. 11
    HerausforderungEingeschlossene Endpunkte beibehalten
  12. 12
    HerausforderungZwei Anforderungen und einen Ausschluss übersetzen
  13. 13
    ZusammenfassungBedeutung, Gruppierung, dann erreichte Teile lesen
4

Einen Lieferauftrag validieren, einordnen und testen

16 Schritte
Verfolge verschachtelte Prüfungen, erhalte zulässige Nullwerte und entwirf Tests, die Lücken und falsche Schwellenwerte aufdecken.

Speichere diese Einheit, um jede Interaktive Lektion Schritt für Schritt durchzugehen.

  1. 1
    EinführungJede Eingabe braucht den beabsichtigten Pfad
  2. 2
    BeispielValidieren, bevor ein Service gewählt wird
  3. 3
    BeispielDen inneren Pfad nachvollziehen
  4. 4
    HerausforderungFinde heraus, zu welchem if das else gehört
  5. 5
    VerbindungAbflachen, wenn es eine gemeinsame Aktion gibt
  6. 6
    ErklärungNull und fehlende Werte werden beide als falsch ausgewertet
  7. 7
    BeispielText, der nach Nein aussieht, kann trotzdem bestehen
  8. 8
    HerausforderungEine echte Null erhalten
  9. 9
    KernaussageEin Operator kann Text auswählen
  10. 10
    BeispielEinen Pfad festhalten, ohne Tests zu erfinden
  11. 11
    TippTests für Pfade und Grenzen wählen
  12. 12
    HerausforderungEine weit gefasste Bedingung verdeckt einen späteren Zweig
  13. 13
    VerbindungNach Lücken und unbeabsichtigten Überschneidungen suchen
  14. 14
    TippDen Wert vor einem riskanten Vergleich untersuchen
  15. 15
    HerausforderungEine korrigierte Entscheidung vollständig testen
  16. 16
    ZusammenfassungWerten und Tests einen klaren Zweck geben
5

Befehle abgleichen und Fälle mit Fallbedingungen ergänzen

15 Schritte
Baue ein Befehlsmenü, vollziehe einen Zahlenabgleich mit Fallbedingung nach und unterscheide Bindungsnamen von vorhandenen Konstanten.

Speichere diese Einheit, um jede Interaktive Lektion Schritt für Schritt durchzugehen.

  1. 1
    EinführungEin Vergleichsobjekt, mehrere mögliche Fälle
  2. 2
    BeispielDas Befehlsmenü anlegen
  3. 3
    KernaussageDer nächste Fall wird nicht automatisch ausgeführt
  4. 4
    BeispielEinen Körper für zwei exakte Befehle verwenden
  5. 5
    HerausforderungDen Auffangfall an die richtige Stelle setzen
  6. 6
    TippDas Verhalten von Zahlen- und booleschen Mustern prüfen
  7. 7
    ErklärungEin einfacher Name bindet jedes Vergleichsobjekt
  8. 8
    BeispielDen gebundenen Wert mit einer Fallbedingung prüfen
  9. 9
    HerausforderungNach einer falschen Fallbedingung weitermachen
  10. 10
    BeispielAuch ein großgeschriebener Name bindet
  11. 11
    VerbindungEin Punkt ändert das Nachschlageverhalten
  12. 12
    BeispielEine passende Literalalternative benennen
  13. 13
    HerausforderungDie passende Menüstruktur für die Aufgabe wählen
  14. 14
    HerausforderungEinen festen Namen bewahren und einen Auffangfall zulassen
  15. 15
    ZusammenfassungMuster lesen, bevor du die Fallkörper liest

Bedingungen in Python: Übungsaufgaben

40 Übungsfragen in 4 Sets

Set 1: Vergleiche lesen und Entscheidungen verfolgen10 Übungsfragen

Frage 1 von 10

Ein Paket darf höchstens 6 Kilogramm wiegen. Welcher Test mit weight akzeptiert genau die zulässigen Gewichte?
  1. weight < 6
  2. weight >= 6
  3. weight <= 6
  4. weight > 6
Antwort zeigenAntwort ausblenden
Antwort: C
„Höchstens“ schließt das Maximum ein, daher akzeptiert 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

Was ergibt "14" < "7"?
  1. False, weil 14 größer als 7 ist.
  2. True, weil "1" vor "7" kommt.
  3. False, weil die Zeichenketten verschieden sind.
  4. True, weil zwei Ziffern mehr sind als eine.
Antwort zeigenAntwort ausblenden
Antwort: B
Beide Operanden sind Zeichenketten, daher vergleicht Python die Zeichen von links. Das Zeichen "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")
  1. Nur Available
  2. Available, dann Checked
  3. Es wird nichts ausgegeben
  4. Nur Checked
Antwort zeigenAntwort ausblenden
Antwort: D
Der Vergleich 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
  1. 7
  2. 2
  3. False
  4. 0
Antwort zeigenAntwort ausblenden
Antwort: A
Ein bedingter Ausdruck prüft zuerst seine Bedingung und wählt den Wert für den falschen Fall, wenn die Bedingung nicht erfüllt ist. Hier ist 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")
  1. Silver, dann Bronze
  2. Nur Silver
  3. Nur Bronze
  4. Nur Starter
Antwort zeigenAntwort ausblenden
Antwort: B
Der erste Vergleich schlägt fehl, weil 46 unter 50 liegt. Der nächste Vergleich ist erfüllt, daher gibt Python 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

Ein Download darf starten, wenn eine Person ein Abonnement oder einen Tagespass hat, auch wenn sie beides hat. Welche Bedingung setzt die Regel um?
  1. has_subscription or has_day_pass
  2. has_subscription and has_day_pass
  3. not has_subscription and has_day_pass
  4. not (has_subscription or has_day_pass)
Antwort zeigenAntwort ausblenden
Antwort: A
Das einschließende 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

Bei den Zahlen 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?
  1. total / items > 8 and items != 0
  2. items == 0 or total / items > 8
  3. items != 0 or total / items > 8
  4. items != 0 and total / items > 8
Antwort zeigenAntwort ausblenden
Antwort: D
Die Prüfung auf ungleich null muss links von 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

Was gibt bool("no") zurück?
  1. Die Zeichenkette "no"
  2. False
  3. True
  4. Den Wert None
Antwort zeigenAntwort ausblenden
Antwort: C
Die Zeichenkette "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

Eine Regel für ganze Zahlen soll Werte von visits ab 24 akzeptieren. Jemand hat visits > 24 geschrieben. Welche Eingabe deckt das falsche Ergebnis am direktesten auf?
  1. 23
  2. 25
  3. 24
  4. 26
Antwort zeigenAntwort ausblenden
Antwort: C
Die beabsichtigte Regel akzeptiert 24, der geschriebene strenge Vergleich lehnt diesen Wert aber ab. Die Eingaben 23 und 25 verhalten sich bei >= 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")
  1. Nur Stored
  2. Unknown, dann End
  3. Stored, dann End
  4. Nur Unknown
Antwort zeigenAntwort ausblenden
Antwort: B
Das Vergleichsobjekt "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
  1. False, weil n negativ ist.
  2. False, weil der Rest -1 ist.
  3. True, weil jede Zahl ungleich null ungerade ist.
  4. True, weil der Rest 1 ist.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 2 von 10

Ein Programm liest level = input("Level: ") ein. Eingetippt wird 16. Was passiert, wenn das Programm danach level < 20 auswertet?
  1. Es löst einen TypeError aus.
  2. Das Ergebnis ist True.
  3. Das Ergebnis ist False.
  4. Es setzt level auf 20.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 3 von 10

Welche Anweisung ist in Python eigens dafür da, in einem noch unfertigen Zweig nichts zu tun?
  1. else
  2. elif
  3. pass
  4. if
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"
  1. "High"
  2. "Middle"
  3. "Low"
  4. "High Middle"
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 5 von 10

Welches Paar boolescher Eingangswerte macht is_open and not is_full wahr?
  1. is_open = False, is_full = False
  2. is_open = True, is_full = True
  3. is_open = False, is_full = True
  4. is_open = True, is_full = False
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 6 von 10

Eine Buchung ist nur an einem Werktag erlaubt und nur, wenn die Person Guthaben oder einen Gutschein hat. Welcher Ausdruck setzt diese Regel um?
  1. is_weekday and (has_credit or has_voucher)
  2. is_weekday and has_credit and has_voucher
  3. (is_weekday and has_credit) or has_voucher
  4. is_weekday or (has_credit and has_voucher)
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")
  1. Nur Book first
  2. Nur Closed
  3. Enter, dann Closed
  4. Es wird nichts ausgegeben
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 8 von 10

Welchen Wert gibt "" or "Reader" zurück?
  1. Die leere Zeichenkette ""
  2. Den booleschen Wert False
  3. Die Zeichenkette "Reader"
  4. Den booleschen Wert True
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 9 von 10

Welche case-Kopfzeile leitet die Zeichenketten "edit" und "change" beide in denselben Körper?
  1. case "edit" | "change":
  2. case "edit" or "change":
  3. case "edit" and "change":
  4. case "edit" == "change":
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")
  1. Negative 11
  2. Even 11
  3. Es wird nichts ausgegeben
  4. Nur 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

Eine Rechnung ergibt 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?
  1. a == b
  2. abs(a - b) > 1e-8
  3. abs(a - b) < 1e-8
  4. abs(a + b) < 1e-8
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)
  1. Empty, dann 0
  2. Nur 0
  3. Empty, dann 4
  4. Nur 4
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"
  1. True
  2. "Open"
  3. False
  4. "Reserved"
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
  1. Er löst sofort einen ZeroDivisionError aus.
  2. Er liefert True, ohne zu dividieren.
  3. Er liefert False, ohne zu dividieren.
  4. Er dividiert, nachdem count geprüft wurde.
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")
  1. Get a badge, dann Checked; der innere Test schlägt fehl.
  2. Enter, dann Checked; der Ausweistest ist erfüllt.
  3. Nur Checked; das äußere else wird übersprungen.
  4. Nur Get a badge; das innere else wird ausgeführt.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 6 von 10

Null ist eine zulässige angegebene Anzahl, und None bedeutet, dass keine Anzahl angegeben wurde. Welche Zuweisung verwendet den Standardwert 9 nur für fehlende Daten?
  1. count = supplied or 9
  2. count = 9 if not supplied else supplied
  3. count = supplied if supplied else 9
  4. count = 9 if supplied is None else supplied
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")
  1. 0
  2. -1
  3. 1
  4. 2
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")
  1. now
  2. later
  3. Unknown
  4. True
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 9 von 10

Ein Sensor akzeptiert Messwerte von -4 bis einschließlich 9. Welche Bedingung ist äquivalent zu not (-4 <= reading <= 9)?
  1. reading <= -4 or reading >= 9
  2. reading < -4 and reading > 9
  3. reading >= -4 and reading <= 9
  4. reading < -4 or 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)
  1. Der Wert bleibt "x", und nichts wird ausgegeben.
  2. Der Wert bleibt "x", und x wird ausgegeben.
  3. Der Wert wird zu "z", und z wird ausgegeben.
  4. Der Wert wird zu True, und True wird ausgegeben.
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

Eine Eingabeaufforderung akzeptiert "go" trotz Leerraumzeichen am Rand und Unterschieden in der Groß- und Kleinschreibung. Sie muss "gopher" und "stop" ablehnen. Welche Bedingung setzt das um?
  1. answer.strip().lower() in "go"
  2. answer.strip().lower() == "go"
  3. "go" in answer.strip().lower()
  4. answer.strip() == "go"
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)
  1. Nur No units
  2. Nur 0
  3. Nur 15
  4. Es kommt zu einem ZeroDivisionError.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 3 von 10

Bei ganzzahligen Punktzahlen lautet die Bewertung "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?
  1. >= 35: Mid; >= 70: High; sonst: Low
  2. >= 70: High; >= 35: Low; sonst: Mid
  3. >= 35: High; >= 70: Mid; sonst: Low
  4. >= 70: High; >= 35: Mid; sonst: Low
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 4 von 10

Ein Dienst soll nur laufen, wenn mindestens eine von zwei Verbindungen, wired und wireless, verfügbar ist und keine Wartung läuft. Welche Bedingung setzt die gesamte Regel um?
  1. wired or wireless and not maintenance
  2. wired and wireless and not maintenance
  3. (wired or wireless) and not maintenance
  4. (wired or wireless) or not maintenance
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 5 von 10

Punktzahlen sind ganze Zahlen von 0 bis 12. Gültige Punktzahlen ab 9 brauchen "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?
  1. Außen score >= 0 prüfen; innen einordnen; sonst Invalid ausgeben.
  2. Außen 0 <= score <= 12 prüfen; innen einordnen; sonst Invalid ausgeben.
  3. Außen score <= 12 prüfen; innen einordnen; sonst Invalid ausgeben.
  4. Zuerst einordnen; dann 0 <= score <= 12 prüfen und bei Misserfolg Invalid ausgeben.
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"
  1. "Morgan"
  2. "Visitor"
  3. True
  4. ""
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")
  1. 39
  2. 40
  3. 79
  4. 80
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")
  1. Nur Boolean case
  2. Number case, dann Boolean case
  3. Nur Number case
  4. Nur Other case
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 9 von 10

Eine Kette mit vier Zweigen gibt eine von vier Bezeichnungen aus. Vier verschiedene Eingaben geben alle die erste Bezeichnung aus. Wie viele Zweige haben diese Tests abgedeckt?
  1. Einen Zweig
  2. Zwei Zweige
  3. Drei Zweige
  4. Vier Zweige
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 10 von 10

Welches Schlüsselwort leitet in case n ___ n > 4: die zusätzliche Bedingung nach einem Muster ein?
  1. and
  2. if
  3. as
  4. elif
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Hängst du bei deiner eigenen Aufgabe fest? Hausaufgabenhilfe

Schlüsselbegriffe

55 Schlüsselbegriffe, jeweils mit Definition

A

Abflachung
Bei der Abflachung werden verschachtelte Entscheidungen mit weniger Einrückungsebenen umgeschrieben, ohne dass sich die Wahl der Zweige und die Aktionen ändern.
Bei der Abflachung zweier Prüfungen mit einer gemeinsamen Aktion kann eine and-Bedingung die Verschachtelung ersetzen.
Ablauftabelle
Eine Ablauftabelle hält Variablenwerte, erreichte Bedingungen und Aktionen in der Reihenfolge der Ausführung fest, sodass sich der Weg durch ein Programm von Hand verfolgen lässt.
Eine Ablauftabelle vermerkt spätere Notenprüfungen als übersprungen, nachdem ein früherer Zweig die Note zugewiesen hat.
als falsch ausgewerteter Wert
Ein als falsch ausgewerteter Wert lässt eine Bedingung scheitern; dazu gehören null, None, False, leerer Text und leere eingebaute Sammlungen.
Weil null als falsch ausgewertet wird, wählt quantity or 1 den Standardwert, auch wenn null absichtlich eingegeben wurde.
als wahr ausgewerteter Wert
Ein als wahr ausgewerteter Wert lässt eine Bedingung erfüllt sein; dazu gehören Zahlen ungleich null und nicht leere Zeichenketten, auch solche, die „falsch“ besagen.
Der als wahr ausgewertete Wert "False" erfüllt if answer:, weil seine Zeichen die Zeichenkette nicht leer machen.
as-Muster
Ein as-Muster benennt das Vergleichsobjekt, das ein spezifischeres Muster akzeptiert hat, und bewahrt so den tatsächlich passenden Wert für den Körper.
Das as-Muster in case "y" | "yes" as reply: speichert "y", wenn genau diese Zeichenkette angegeben wurde.
Auffangzweig
Ein Auffangzweig behandelt Eingaben, die frühere Fälle nicht akzeptiert haben, etwa ein abschließendes else in einer mehrseitigen Verzweigung.
Ein Auffangzweig kann für Menüeingaben außer "1" oder "2" den Text "Unknown option" ausgeben.

Ä

äquivalente Bedingungen
Äquivalente Bedingungen liefern für jede zulässige Kombination ihrer Eingangswerte denselben Wahrheitswert, auch wenn sie unterschiedlich geschrieben sind.
Die äquivalenten Bedingungen not (age >= 18) und age < 18 stimmen für jedes ganzzahlige Alter überein.
äußere Bedingung
Eine äußere Bedingung steuert den Eintritt in einen Block, der eine weitere Entscheidung enthält, und entscheidet so, ob die innere Prüfung überhaupt erreicht wird.
Ist die äußere Bedingung has_ticket falsch, wird der innere Altersvergleich übersprungen.

B

bedingter Ausdruck
Ein bedingter Ausdruck wählt mit a if condition else b einen von zwei Werten aus, liefert ihn und wertet nur den gewählten Wert aus.
Der bedingte Ausdruck fee = 0 if has_pass else 4 speichert 4, wenn kein Pass vorhanden ist.
Bindungsmuster
Ein Bindungsmuster ist ein einfacher Name, der jedes Vergleichsobjekt akzeptiert und diesem Namen zuweist, auch wenn der Name bereits einen Wert speichert.
Das Bindungsmuster case STOP: überschreibt STOP; die Großschreibung macht daraus kein Nachschlagen.
Block
Ein Block ist eine Gruppe von Anweisungen auf derselben Einrückungsebene, die Python als Körper einer Verzweigung oder einer anderen Anweisung behandelt.
Zwei eingerückte print()-Aufrufe unter einer Temperaturprüfung gehören zu dem Block, den die Prüfung steuert.
boolescher Operator
Ein boolescher Operator verknüpft Wahrheitswerte oder kehrt sie um; Python verwendet dafür die kleingeschriebenen Wörter and, or und not.
Ein boolescher Operator verbindet in has_ticket and is_open die beiden Anforderungen zu einer Prüfung.
boolescher Wert
Ein boolescher Wert ist einer der beiden Werte True und False, mit denen Python das Ergebnis einer Ja-Nein-Prüfung ausdrückt.
Der boolesche Wert, den is_ready = count >= 4 speichert, ist True, wenn count gleich 4 ist.

D

de Morgansche Gesetze
Die de Morganschen Gesetze formen eine verneinte boolesche Gruppe um, indem sie jeden Teil verneinen und and und or gegeneinander austauschen; der Wahrheitswert bleibt dabei erhalten.
Die de Morganschen Gesetze machen aus not (A or B) den Ausdruck not A and not B, in dem beide Teile umgekehrt sind.

E

Eingabevalidierung
Die Eingabevalidierung prüft, ob angegebene Daten die zulässigen Regeln des Programms erfüllen, bevor sie für eine weitere Entscheidung verwendet werden.
Die Eingabevalidierung mit 0 <= score <= 100 weist 150 zurück, bevor eine Note vergeben werden kann.
eingeschlossene Grenze
Eine eingeschlossene Grenze ist eine Grenze, die zum akzeptierten Bereich gehört; in einem Zahlenvergleich wird sie mit <= oder >= ausgedrückt.
Die eingeschlossene Grenze in age >= 18 lässt eine Person, die genau 18 ist, die Prüfung bestehen.
Einrückung
Die Einrückung ist der Leerraum am Zeilenanfang, der kennzeichnet, zu welchem Block eine Anweisung gehört; nach Python-Konvention sind es 4 Leerzeichen pro Ebene.
Entfernst du bei print("Done") in einem if-Rumpf eine Einrückungsebene, wird die Zeile nach der ganzen Entscheidung ausgeführt.
einschließendes Oder
Ein einschließendes Oder akzeptiert jede der beiden Alternativen und auch beide zusammen; das boolesche or von Python hat diese Bedeutung.
Durch das einschließende Oder ist is_member or has_coupon erfüllt, wenn sowohl eine Mitgliedschaft als auch ein Gutschein vorliegen.
elif-Klausel
Eine elif-Klausel ergänzt eine if-Kette um einen weiteren Zweig mit Bedingung und wird erst berücksichtigt, wenn alle früheren Bedingungen falsch waren.
Die elif-Klausel für Punktzahlen ab 80 wird erst erreicht, nachdem die Prüfung auf 90 fehlgeschlagen ist.
else-Zweig
Ein else-Zweig ist der alternative Körper, der ausgeführt wird, wenn die Bedingung des zugehörigen if falsch ist; die Kopfzeile else: hat keine Bedingung.
Bei einem if-Test auf gerade Zahlen wird der else-Zweig für -7 ausgeführt, weil der Rest nicht null ist.

F

Fallbedingung (Guard)
Eine Fallbedingung ist eine 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.
Die Fallbedingung in case n if n < 0: prüft die gebundene Zahl, bevor der Fall für negative Zahlen gewählt wird.

G

Grenzwerttest
Ein Grenzwerttest prüft eine Grenze und benachbarte Eingaben, um einen Vergleich zu entdecken, der den falschen Endpunkt ein- oder ausschließt.
Ein Grenzwerttest verwendet 17, 18 und 19, um eine ganzzahlige Regel zu prüfen, die als age >= 18 geschrieben ist.

I

Identitätsprüfung
Eine Identitätsprüfung prüft mit is oder is not, ob Referenzen dasselbe Objekt bezeichnen; meist dient sie dazu, None zu erkennen.
Die Identitätsprüfung result is None unterscheidet ein fehlendes Ergebnis von einem echten Wert null.
if-Anweisung
Eine if-Anweisung prüft eine Bedingung, führt ihren eingerückten Körper nur aus, wenn die Bedingung als wahr ausgewertet wird, und macht danach nach diesem Körper weiter.
Die if-Anweisung mit der Kopfzeile if stock > 0: überspringt ihren Körper, wenn stock null ist.

K

Konjunktion
Eine Konjunktion ist eine mit and verknüpfte Bedingung, die nur erfüllt ist, wenn beide Anforderungen erfüllt sind, etwa die beiden Ränder eines Bereichs.
Die Konjunktion age >= 13 and age <= 19 lehnt Alterswerte auf beiden Seiten des Teenageralters ab.
Kurzschlussauswertung
Die Kurzschlussauswertung überspringt einen späteren booleschen Operanden, wenn der linke Operand bereits entschieden hat, ob die Bedingung erfüllt ist.
Die Kurzschlussauswertung überspringt total / count, wenn die mit and verknüpfte Prüfung count != 0 falsch ist.

L

Literalmuster
Ein Literalmuster prüft auf eine feste Zahl, eine Zeichenkette, einen booleschen Wert oder None; Zahlen- und Zeichenkettenliterale werden auf Gleichheit verglichen.
Das Literalmuster case 6: akzeptiert die Zahl 6, lehnt aber den Text "6" ab, den eine Eingabe liefert.

M

match-Anweisung
Eine match-Anweisung gleicht ein Vergleichsobjekt der Reihe nach mit den Mustern der Fälle ab, führt nur den Körper des ersten passenden Falls aus und macht dann weiter.
Die match-Anweisung für "stop" überspringt case "start": und führt den Körper unter case "stop": aus.

O

Oder-Muster
Ein Oder-Muster verbindet alternative Muster mit | und ist erfolgreich, wenn eine der Alternativen passt; alle teilen sich einen Fallkörper.
Das Oder-Muster case "open" | "load": führt für beide Befehle denselben Körper aus.
Operand
Ein Operand ist ein Wert oder Ausdruck, auf den ein Operator wirkt; and und or geben einen ihrer Operanden zurück statt immer einen booleschen Wert.
Der linke Operand von "" or "Guest" wird als falsch ausgewertet, daher gibt der Ausdruck den rechten Operanden zurück.
Operatorvorrang
Der Operatorvorrang legt fest, wie ein Ausdruck ohne zusätzliche runde Klammern gruppiert wird; dabei wird and vor or gruppiert.
Nach dem Operatorvorrang wird A or B and C als A or (B and C) gelesen, sofern runde Klammern nichts anderes festlegen.

P

pass-Anweisung
Eine pass-Anweisung ist eine gültige Anweisung, die nichts tut; mit ihr kann ein erforderlicher Block existieren, bevor sein eigentlicher Code geschrieben ist.
Eine eingerückte pass-Anweisung hält einen unfertigen if-Körper gültig, ohne eine Ausgabe zu erzeugen.
Platzhaltermuster
Ein Platzhaltermuster ist _; es akzeptiert jedes Vergleichsobjekt, ohne ihm einen Namen zu geben, und muss ohne Fallbedingung als letzter Fall stehen.
Ein Platzhaltermuster gibt "Unknown command" aus, wenn die früheren festen Befehlsmuster nicht passen.
Programmablaufplan (Flussdiagramm)
Ein Programmablaufplan ist ein Diagramm der Programmpfade, das eine Entscheidung als Raute mit getrennten True- und False-Wegen zur nächsten Aktion darstellt.
Ein Programmablaufplan zeigt, wie beide Wege nach dem Körper einer einseitigen Temperaturentscheidung wieder zusammenlaufen.
Pseudocode
Pseudocode beschreibt Programmschritte in Alltagssprache und macht die beabsichtigten Entscheidungen klar, bevor sie in Python-Syntax geschrieben werden.
Pseudocode kann vor dem Programmieren lauten: „Weise eine Punktzahl außerhalb des Bereichs zurück; vergib sonst ihre Note.“

R

Regel des ersten zutreffenden Falls
Die Regel des ersten zutreffenden Falls wählt in einer Entscheidungskette den frühesten erfolgreichen Zweig und überspringt alle übrigen Bedingungen und Körper.
Nach der Regel des ersten zutreffenden Falls wird eine Punktzahl von 95 von >= 60 erfasst, wenn diese weit gefasste Prüfung zuerst steht.

S

Schutzbedingung
Eine Schutzbedingung ist eine Prüfung vor einer Operation, mit der die Kurzschlussauswertung diese Operation verhindern kann, wenn sie fehlschlagen würde.
Eine Schutzbedingung prüft in count != 0 and total / count > 10 zuerst count != 0 und erst dann die Division.
Schwellenwert
Ein Schwellenwert ist ein Wert, an dem sich das Ergebnis einer Entscheidung ändert; der Vergleichsoperator bestimmt, auf welcher Seite dieser Wert selbst liegt.
Eine Notenschwelle von 90 ordnet 90 der höheren Stufe zu, wenn die Prüfung score >= 90 lautet.
Standardwert
Ein Standardwert ist ein Ersatzwert, der verwendet wird, wenn ein bevorzugter Wert fehlt oder ungeeignet ist, etwa ein Text, den ein or-Ausdruck auswählt.
Der Standardwert "Guest" wird in name or "Guest" gewählt, wenn name die leere Zeichenkette ist.

T

Toleranz
Eine Toleranz ist die Abweichung, die eine Zahlenprüfung zulässt, wenn berechnete Werte kleine Näherungsfehler enthalten können.
Eine Toleranz von 1e-9 lässt abs(a - b) < 1e-9 eine winzige Abweichung zwischen berechneten Gleitkommazahlen akzeptieren.
Typumwandlung
Eine Typumwandlung erzeugt einen Wert eines anderen Datentyps, etwa wenn Ziffern als Text vor einem Größenvergleich mit int() in eine ganze Zahl umgewandelt werden.
Die Typumwandlung in level = int(input("Level: ")) ermöglicht eine Prüfung gegen eine Zahlengrenze.

U

unerreichbarer Zweig
Ein unerreichbarer Zweig ist ein Zweig, den keine Eingabe betreten kann, weil frühere Entscheidungen oder widersprüchliche Anforderungen dies immer verhindern.
Ein unerreichbarer Zweig entsteht, wenn elif score >= 90: auf das weiter gefasste if score >= 60: folgt.
Unicode-Codepunkt
Ein Unicode-Codepunkt ist die Zahl, die einem Zeichen zugeordnet ist; Python verwendet diese Zahlen, wenn es Zeichenketten von links nach rechts vergleicht.
Der Unicode-Codepunkt von "Z" ist kleiner als der von "a", daher ist "Zebra" < "apple" wahr.

V

Vergleich mit Beachtung der Groß- und Kleinschreibung
Ein Vergleich mit Beachtung der Groß- und Kleinschreibung behandelt Groß- und Kleinbuchstaben als verschiedene Zeichen, wenn Text auf Gleichheit oder Reihenfolge geprüft wird.
Ein Vergleich mit Beachtung der Groß- und Kleinschreibung lehnt "Yes" ab, wenn genau der Text "yes" verlangt ist.
Vergleichsobjekt
Das Vergleichsobjekt ist der Wert, den eine match-Anweisung mit den Mustern ihrer Fälle abgleicht; es steht in der Kopfzeile nach dem Schlüsselwort match.
In match command: ist der aktuelle Wert von command das Vergleichsobjekt für jeden Abgleich.
Vergleichsoperator
Ein Vergleichsoperator prüft Werte auf Gleichheit oder Reihenfolge und liefert ein boolesches Ergebnis, so wie <=, das eine Grenze einschließt.
Der Vergleichsoperator in weight <= 8 akzeptiert ein Gewicht von genau 8 Kilogramm.
verketteter Vergleich
Ein verketteter Vergleich verbindet benachbarte Vergleiche in einem Ausdruck und ist nur erfüllt, wenn jeder Vergleich der Kette erfüllt ist.
Der verkettete Vergleich 2 <= level <= 9 schließt 2 und 9 ein, lehnt aber den Wert 10 ab.
verschachtelte Verzweigung
Eine verschachtelte Verzweigung ist eine Verzweigung innerhalb eines anderen Zweigs; ihre Prüfung wird daher nur erreicht, wenn die Ausführung diesen äußeren Zweig betritt.
Die verschachtelte Verzweigung prüft das Alter einer Person erst, nachdem die äußere Ticketprüfung erfolgreich war.

W

Wahrheitstabelle
Eine Wahrheitstabelle listet jede Kombination boolescher Eingangswerte mit dem jeweiligen Ergebnis auf; so lässt sich eine zusammengesetzte Bedingung vollständig prüfen.
Eine Wahrheitstabelle für zwei Eingangswerte hat vier Zeilen, darunter den Fall, dass beide wahr sind.
Wahrheitswertauswertung (Truthiness)
Die Wahrheitswertauswertung legt fest, welchen Wahrheitswert Python einem beliebigen Wert in einer Bedingung zuordnet; so können Zahlen oder Texte einen Zweig steuern.
Durch die Wahrheitswertauswertung lehnt if name: eine leere Antwort ab, ohne ausdrücklich mit "" zu vergleichen.
Wertmuster
Ein Wertmuster ist ein Name mit Punkt, der einen vorhandenen Wert nachschlägt und das Vergleichsobjekt auf Gleichheit damit vergleicht, ohne zu binden.
Das Wertmuster math.pi vergleicht mit einem vorhandenen Wert aus einem Modul, statt einem einfachen Namen etwas zuzuweisen.

Z

Zugehörigkeitsoperator
Ein Zugehörigkeitsoperator prüft, ob ein Wert in einem anderen Wert vorkommt; bei Zeichenketten prüfen in und not in auf exakte Teilzeichenketten.
Der Zugehörigkeitsoperator in "rain" in "raincoat" findet den Text und liefert True.
Zuweisung
Eine Zuweisung speichert mit = einen Wert unter einem Variablennamen und ersetzt dabei einen Wert, der diesem Namen bereits zugeordnet war.
Die Zuweisung score = 28 ändert score; score == 28 vergleicht nur den aktuellen Wert.
Zweigüberdeckung
Die Zweigüberdeckung gibt an, ob die gewählten Tests jeden Zweig mindestens einmal ausgeführt haben, einschließlich Auffangzweigen und verschachtelten Zweigen.
Für die Zweigüberdeckung einer Kette mit vier Zweigen braucht man mindestens vier Eingaben, die unterschiedliche Wege nehmen.
zweiseitige Verzweigung
Eine zweiseitige Verzweigung wählt mit if und else genau einen von zwei Pfaden, mit einem Körper für jeden der beiden Wahrheitswerte.
Eine zweiseitige Verzweigung legt auf beiden Pfaden Versandkosten fest, bevor der Gesamtbetrag ausgegeben wird.

Über diese Einheit

Von StudeliFehler melden

Erstelle deine eigenen Lernmaterialien

Mach aus deinen Notizen, Folien und Dokumenten Lernleitfäden, Übungsfragen, Karteikarten und 6 weitere Tools.

Jetzt starten