· 

Logische und Vergleichsoperatoren in Python

1. Einführung

Um z. B. Bedingungen in if-Anweisungen oder while-Schleifen formulieren zu können, benötigt man sogenannte logische bzw. Vergleichsoperatoren. Mit ihnen können boolesche Ausdrücke umgesetzt werden. Diese können entweder wahr (True) oder falsch (False) sein. Mit ihnen lassen sich demnach Bedingungen für die Kontrollstrukturen "if-Anweisung" und "while-Schleife" festlegen.

Die einfachsten booleschen Ausdrücke in Python sind 

True

und

False

True ist ein Ausdruck, der immer wahr und False ein Ausdruck, der immer falsch ist. Wenn man eine if-Anweisung mit der Bedingung True definiert, dann wird also der else-Zweig nie erreicht.

if True:
   print("Wird immer erreicht!")
else:
   print("Wird nie erreicht!")

Umgekehrt lässt sich  mit False eine if-Anweisung definieren, in der immer der else-Block ausgeführt wird.

if False:
   print("Wird nie erreicht!")
else:
   print("Wird immer erreicht!")

Über den Sinn und Unsinn solcher Konstruktionen lässt sich natürlich streiten.


2. Vergleichsoperatoren in Python

In Python gibt es eine Vielzahl von Vergleichsoperatoren, die man auch aus der Mathematik kennt. Da wären <, >, <= und >=. Mit ihnen können z. B. Zahlenwerte miteinander verglichen werden. Als Ergebnis wird jeweils ein Wahrheitswert zurückgegeben, den man dann entweder einer Variable zuweisen kann oder direkt als Bedingung in eine Kontrollstruktur gibt.

Als Beispiel definieren wir uns erstmal 3 Variablen, nämlich a, b und c. Diesen weisen wir die folgenden Zahlenwerte zu:

a = 2
b = 3
c = 2

Nun können wir mit den Vergleichsoperatoren arbeiten und so Variablen Wahrheitswerte zuordnen, sowie in Kontrollstrukturen Bedingungen formulieren.

a = 2
b = 3
c = 2

d = a < b # d ist True

print(a <= c) # gibt True aus

if(a > c):
   print("Hey!") # "Hey" wird nicht ausgegeben

if(a >= c):
   print("Hi!") # "Hi!" Wird ausgegeben

Mit speziellen magischen Methoden (__lt__, __gt__, __le__, __ge__) lassen sich aber auch Objekte miteinander vergleichen, die nicht numerischer Natur sind. Man muss sich als Informatiker dann aber natürlich überlegen, wie ein sinnvoller Größenvergleich zwischen einem Haus und einem Auto aussieht. Betrachtet man nur das tatsächliche Größenattribut oder möchte man eher Preis bzw. Wertigkeit miteinander vergleichen? Dazu in einem anderen Video mehr.

Neben <, >, <= und >= gibt es noch == und !=. Mit == prüft man, ob zwei Objekte (bzw. Zahlen) gleich sind und mit != wird auf die Ungleichheit zweier Objekte (bzw. Zahlen) geprüft. Auch hier kann man mit einer magischen Methode (__eq__, __ne__) genau definieren, wie ein Objektvergleich konkret auszusehen hat. Sind zwei Personen bereits gleich, wenn sie denselben Namen besitzen oder gehört dazu in deiner Anwendung schon etwas mehr? Python bietet dir hier zahlreiche Möglichkeiten genau das zu implementieren, was du benötigst!

An dieser Stelle genügt ein einfacher Vergleich zweier Variablen, um zu sehen, wie man mit den beiden Operatoren arbeiten kann.

a = 2
b = 3
c = 2

print(a == b) # False
print(a == c) # True
print(b != c) # True

3. Logische Operatoren in Python

Bevor du dich mit den logischen Operatoren beschäftigst, solltest du dir meinen Artikel zur Einführung in die Aussagenlogik mit Sherlock Holmes durchlesen. Dort habe ich erklärt, was Aussagen sind und wie man diese mit logischen Verknüpfungen zu komplexen Aussagen kombinieren kann. Genau dieser Logik folgend funktionieren auch logische Operatoren in Python.

Mit and können zwei boolsche Ausdrücke (bzw. Wahrheitswerte) miteinander kombiniert werden. Die Gesamtaussage ist nur dann wahr, wenn jeder der booleschen Ausdrücke ebenfalls wahr ist. and verhält sich demnach wie das "logische Und".

print(False and False) # False
print(False and True) # False
print(True and False) # False
print(True and True) # True

Wenn Vergleichsoperatoren mit and verwendet wurden, haben diese Vorrang, d. h. erst werden die Vergleiche durchgeführt und die daraus entstandenen booleschen Ausdrücke mit dem and verknüpft.

print(2 < 3 and 4 >= 4) # True

Mit or können ebenfalls zwei boolsche Ausdrücke miteinander kombiniert werden. Die Gesamtaussage ist nur dann wahr, wenn mindestens einer der so kombinierten booleschen Ausdrücke wahr ist. or verhält sich demnach wie das "logische Oder".

print(False and False) # False
print(False and True) # True
print(True and False) # True
print(True and True) # True

Auch hier haben die Vergleichsoperatoren wieder Vorrang vor dem logischen Operator, d. h. erst werden die Vergleiche durchgeführt und die daraus entstandenen booleschen Ausdrücke mit dem or verknüpft. 

print(2 < 3 or 1 > 0) # True

Als letzten logischen Operator betrachten wir die Negationsoperator not. Hierfür wird tatsächlich einfach das Schlüsselwort not vor den zu negierenden Ausdruck geschrieben. Aus True wird dann False und aus False wird dann True.

print(not True) # False
print(not False) #True

Du kannst übrigens durch mehrfaches Hintereinanderschreiben von not den negierten Wahrheitswert wieder negieren. not not True liefert also True.

print(not not True) # True

Wie in der Aussagenlogik gibt es bei den Operatoren eine Bindungsstärke, d. h. einige Operatoren binden stärker als andere. Auch in Python gilt:

  • not bindet stärker als and
  • and bindet stärker als or

Wie bereits festgestellt, binden Vergleichsoperatoren stärker als logische Operatoren. Dieser Ausdruck

print(2 > 3 and 4 <= 4 or 1 > 0)

liefert also True, denn es wird zuerst 2 > 3 (False) mit 4 <= 4 (True) via and verknüpft, was False ergibt und das Ergebnis dann durch ein or mit der wahren Aussage 1 > 0 (True) kombiniert. 

Die bitweisen logischen Operatoren klären wir in einem anderen Artikel.