Python-Kurs / Vergleiche und logische Operatoren mit Grenzfällen prüfen

Vergleichsoperatoren prüfen Beziehungen zwischen Werten, logische Operatoren verknüpfen Bedingungen. In Python können and und or einen ihrer Operanden statt eines bool-Werts zurückgeben; unterscheiden Sie deshalb Wahrheitsprüfung und Auswahl eines Standardwerts.

Gleichheit, Zuweisung und Identität unterscheiden

Mit == vergleichen Sie Werte, mit = weisen Sie einen Wert zu. != prüft Ungleichheit, < und > die Größenbeziehung. Mit verketteten Vergleichen können Sie Intervalle beschreiben: 0 <= amount <= 10000 schließt beide Grenzen ein. Im folgenden Programm ist dagegen die untere Grenze ausdrücklich offen: 0 < amount.

Ein eingegebener Text "8000" ist nicht automatisch eine Zahl. Prüfen und konvertieren Sie Eingaben, bevor Sie Größenvergleiche voraussetzen. Ein Vergleich wie "8000" > 5000 scheitert mit TypeError, statt die Zeichenkette still in eine Zahl umzuwandeln.

None repräsentiert einen fehlenden Wert. Dafür ist value is None die übliche Prüfung. is prüft die Objektidentität; == vergleicht Werte. Zwei separat erzeugte leere Listen können gleiche Inhalte haben und trotzdem verschiedene Objekte sein. Verwenden Sie is nicht als Ersatz für den Vergleich von Listeninhalten. Die Sprachreferenz zu Vergleichen erläutert diese Regeln.

Ein vollständiges Vergleichsbeispiel ausführen

Speichern Sie den gesamten Code als conditions.py in UTF-8 im Übungsordner. Starten Sie python conditions.py mit dem Projektinterpreter; unter macOS oder Ubuntu kann außerhalb einer aktivierten Umgebung python3 der passende Befehl sein. Zusätzliche Pakete sind nicht erforderlich.

amount = 8000
category = "food"
print(0 < amount <= 10000)
print(amount > 5000 and category == "food")
print(not category)
print("" or "unknown")
print(0 or 100)
print([] == [], [] is [])

Erwartete Ausgabe:

True
True
False
unknown
100
True False

8000 liegt über null und höchstens bei 10000, deshalb ist die erste Zeile True. Auch die zweite Bedingung ist erfüllt: Der Betrag ist größer als 5000 und die Kategorie gleich food. Der Text food ist nicht leer, daher ergibt seine Verneinung False.

Die folgenden beiden Ausgaben sind keine bool-Werte: "" or "unknown" wählt den Text unknown, 0 or 100 wählt die Zahl 100. Zuletzt sind die beiden neu erzeugten leeren Listen nach Inhalt gleich, aber nicht identisch. Die Listenübung zu gemeinsamen Objekten zeigt, warum dieser Unterschied bei Änderungen relevant ist.

Wahrheitswerte und Kurzschlussauswertung verstehen

Leere Zeichenketten, leere Container, numerische null und None werden in Bedingungen als falsch behandelt. Die nichtleere Zeichenkette "False" gilt dagegen als wahr. bool("False") interpretiert also nicht das Wort, sondern prüft den Textwert. Für einen textuellen Konfigurationsschalter müssen Sie die erlaubten Schreibweisen ausdrücklich auswerten.

x and y liefert x, wenn dieser Wert falsch ist; andernfalls wird y ausgewertet und zurückgegeben. x or y liefert bei wahrem x diesen Wert, sonst das Ergebnis von y. not liefert dagegen True oder False. Die Referenz zu booleschen Operationen beschreibt diese Auswahl.

Das Auslassen der rechten Seite heißt Kurzschlussauswertung: Bei False and check() und True or check() wird check nicht aufgerufen. Mit print(False and print("called")) können Sie es getrennt ausprobieren: Es erscheint nur False, nicht called. Bei print(True or print("called")) erscheint nur True.

Verbergen Sie erforderliche Arbeit, etwa Speichern oder Validieren, nicht in einem rechten Operanden, der eventuell gar nicht ausgeführt wird. Schreiben Sie wichtige Verarbeitungsschritte so, dass ihr Ausführungsgrund erkennbar ist. Bei komplexen Kombinationen helfen Klammern und sprechende Zwischennamen, die Absicht deutlich zu machen.

Gültige Nullwerte erhalten und Grenzen testen

amount or 100 ersetzt auch einen gültigen Betrag null durch 100. Wenn ausschließlich None als fehlend gelten soll, verwenden Sie 100 if amount is None else amount. Damit bleibt null erhalten. Entscheiden Sie entsprechend auch bei leeren Zeichenketten und Containern, ob sie erlaubt oder tatsächlich fehlende Daten sind.

  1. Ändern Sie im vollständigen Programm nur amount auf 10000 und danach 10001. Die erste Bedingung muss von True zu False wechseln; die zweite bleibt bei beiden Werten wahr, solange category unverändert food ist.
  2. Prüfen Sie den Wert null: Die erste Bedingung mit 0 < amount ist falsch. Verwechseln Sie das nicht mit dem zuvor erläuterten Intervall mit eingeschlossener Nullgrenze.
  3. Stellen Sie 8000 wieder her und ändern Sie nur die Kategorie auf den leeren Text "". Die zweite Bedingung wird falsch, not category dagegen wahr.
  4. Stellen Sie die ursprüngliche Kategorie wieder her und vergleichen Sie alle sechs Ausgabezeilen.
  5. Vergleichen Sie außerhalb des vollständigen Programms die Standardauswahl für amount = 0 und amount = None. Mit der ausdrücklichen None-Prüfung müssen die Ergebnisse null beziehungsweise 100 sein. Setzen Sie nicht im Hauptbeispiel unbesehen None ein, denn dessen Größenvergleiche sind dafür nicht definiert.

Prüfen Sie Bedingungen an Grenzen, leeren Eingaben und fehlenden Werten. Dass ein Ausdruck bei einem positiven Beispiel den gewünschten Wert liefert, beweist nicht, dass seine Abkürzungen die Bedeutung Ihrer Daten in allen Fällen erhalten.