Drei Wörter statt Symbole
Die logischen Operatoren von Python sind die englischen Wörter and, or und not. Andere Sprachen schreiben sie als &&, || und !. In Python sind && und || ein SyntaxError, und ! kommt nur als Teil von != („ungleich“) vor.
Mit True und False gelten die Regeln, die du erwartest:
a | b | a and b | a or b | not a |
|---|---|---|---|---|
True | True | True | True | False |
True | False | False | True | False |
False | True | False | True | True |
False | False | False | False | True |
and braucht zwei wahre Seiten. or braucht mindestens eine. not nimmt einen einzelnen Wert und kehrt ihn um.
In echtem Code sind die Seiten meist Vergleiche, und das Ergebnis landet in einem if oder einem while:
Ausgabe:
eligible
standard ticket
Für die meisten Bedingungen reicht das. Der Rest dieser Seite zeigt, was die Operatoren mit Werten machen, die nicht True oder False sind, und nach welchen Regeln entschieden wird, welche Seite eines Ausdrucks ausgeführt wird.
Truthy und falsy Werte
and, or und not akzeptieren jeden Wert, nicht nur Booleans. Ob ein Wert als wahr gilt, entscheidet Python anhand seines Wahrheitswerts. Diese Werte sind falsy:
FalseundNone- die Null jedes Zahlentyps:
0,0.0 - leere Container und Strings:
"",[],(),{},set(),range(0)
Alles andere ist truthy, auch "0", "False", [0] und -1. Wie Python einen Wert einordnet, siehst du mit bool():
Ausgabe:
0 False
1 True
-1 True
'' False
'0' True
[] False
[0] True
None False
0.0 False
Der String "0" ist truthy, weil er ein nicht leerer String ist. Darauf fällt herein, wer Zahlen aus einer Eingabe liest und sie vor der Umwandlung prüft. Wie bool mit int zusammenhängt, steht auf der Seite zu Zahlen und Booleans.
and und or geben einen Operanden zurück
Hier unterscheidet sich Python von den meisten Sprachen. and und or erzeugen kein neues True oder False. Sie geben einen der beiden Werte zurück, die du ihnen gegeben hast:
x or yliefertx, wennxtruthy ist, sonst liefert esy.x and yliefertx, wennxfalsy ist, sonst liefert esy.
Wenn beide Operanden Booleans sind, ist „einen Operanden zurückgeben“ dasselbe wie „einen Boolean zurückgeben“. Deshalb fällt der Unterschied erst auf, wenn andere Typen ins Spiel kommen.
not ist die Ausnahme: Es liefert immer True oder False.
Wenn du aus einem and/or-Ausdruck einen echten Boolean brauchst, etwa um ihn zu speichern oder aus einer Funktion zurückzugeben, die bool verspricht, pack ihn in bool():
Kurzschluss-Auswertung
Python wertet and und or von links nach rechts aus und hört auf, sobald die Antwort feststeht:
andstoppt beim ersten falsy Wert, weil nichts danach den ganzen Ausdruck noch wahr machen kann.orstoppt beim ersten truthy Wert, weil nichts danach den ganzen Ausdruck noch falsch machen kann.
Die übersprungene Seite wird gar nicht ausgeführt. Mit Funktionen, die beim Aufruf etwas ausgeben, kannst du dabei zusehen:
Ausgabe:
and:
checking A
False
or:
checking A
True
B wird in keinem der beiden Fälle geprüft. Die Kurzschluss-Auswertung macht Schutzbedingungen sicher. Die zweite Hälfte jeder Bedingung unten würde allein abstürzen, läuft aber erst, nachdem die erste Hälfte den problematischen Fall ausgeschlossen hat:
Setz den billigen oder schützenden Test an den Anfang. Mit umgekehrter Reihenfolge, user.startswith("admin") and user is not None, gibt es einen AttributeError, wenn user gleich None ist.
Muster mit or und and
Weil or seinen ersten truthy Operanden zurückgibt, ergibt es einen Standardwert in einer Zeile:
Ausgabe:
Hello, Ada!
Hello, guest!
Hello, guest!
Der Haken: or ersetzt jeden falsy Wert, nicht nur None. Wenn 0, "" oder [] eine zulässige Eingabe ist, wirft or sie weg:
Nimm x if x is not None else default, wenn null oder leer ein gültiger Wert ist. Diesen bedingten Ausdruck erklärt die if/else-Seite.
Zu and gibt es ein passendes Muster: „nimm diesen Wert nur, wenn der erste gesetzt ist“. Es ist seltener und als if oft klarer, also setz es sparsam ein:
Rangfolge: not, dann and, dann or
Wenn ein Ausdruck alle drei mischt, wendet Python zuerst not an, dann and, dann or. Vergleiche wie ==, < und in kommen vor allen dreien.
a or b and c und (a or b) and c liefern bei denselben Werten unterschiedliche Antworten. Eine gemischte Bedingung sollte deshalb Klammern tragen, auch wenn die Standardreihenfolge zufällig stimmt. Sie kosten nichts und ersparen der nächsten Person die Frage.
and/or vs. &/|
& und | sehen and und or ähnlich und liefern manchmal dieselbe Antwort, sind aber andere Operatoren.
and/orprüfen den Wahrheitswert, werten mit Kurzschluss aus und geben einen der Operanden zurück.&/|sind bitweise Operatoren. Bei Ganzzahlen verknüpfen sie die Bits der beiden Zahlen. Bei Sets bedeuten sie Schnittmenge und Vereinigung. BeiTrueundFalseliefern sie einen Boolean. Sie werten nie mit Kurzschluss aus: Beide Seiten werden immer ausgewertet.
Die bitweisen Operatoren haben außerdem eine höhere Rangfolge als Vergleiche. Dadurch wird eine mit & geschriebene Bedingung zu etwas völlig anderem:
1 & y ist 1 & 5, also 1. Die mittlere Zeile wird damit zur Kette 5 > 1 > 1, und 1 > 1 ist falsch. In normalem Python-Code nimmst du für Bedingungen and, or und not.
Der eine Ort, an dem &, | und ~ für Bedingungen richtig sind, sind NumPy und pandas. Ein Array enthält viele Werte und hat deshalb keinen einzelnen Wahrheitswert, und and wirft ValueError: The truth value of an array ... is ambiguous. Die Bibliotheken überladen & und | so, dass sie Element für Element arbeiten. Deshalb sehen pandas-Filter aus wie df[(df.age > 18) & (df.country == "CA")], mit Klammern um jeden Vergleich, aus dem oben genannten Grund der Rangfolge.
any() und all(): and und or über eine Liste
Um eine ganze Folge von Bedingungen zu verknüpfen, nimm die eingebauten Funktionen all() (ein and über alle Elemente) und any() (ein or über alle Elemente). Beide werten auf dieselbe Weise mit Kurzschluss aus:
Anders als and und or liefern any() und all() immer einen Boolean.
Häufige Fehler
Eine Variable mit or gegen mehrere Werte vergleichen. Diese Bedingung ist immer wahr:
Python liest die erste Bedingung als (color == "red") or "blue". Der Vergleich ist False, also liefert or den Wert "blue", einen nicht leeren String, und der ist truthy. Wiederhole den Vergleich auf beiden Seiten oder, besser, prüf die Zugehörigkeit mit in.
&& oder || schreiben. Beides ist ein SyntaxError. Nimm and und or.
Von and/or einen Boolean erwarten. x = a or b speichert a oder b selbst. Das ist oft genau richtig, aber wenn eine Funktion True oder False zurückgeben soll, wandle mit bool() um.
Sich in gemischten Bedingungen auf die Rangfolge verlassen. a or b and c ist zulässig und eindeutig definiert, aber setz Klammern, damit sich niemand an die Regel erinnern muss.
Häufig gestellte Fragen
Was macht der Operator and in Python?
a and b ist nur wahr, wenn beide Seiten wahr sind. Python wertet zuerst a aus; ist a falsy, gibt es a zurück, ohne b anzusehen, sonst gibt es b zurück. Mit reinen Booleans ergibt das das übliche Ergebnis: True and False ist False.
Warum liefert 0 or 5 den Wert 5 statt True?
0 or 5 den Wert 5 statt True?or und and geben einen ihrer Operanden zurück, keinen neuen Boolean. x or y liefert x, wenn x truthy ist, sonst y. 0 ist falsy, also liefert 0 or 5 den Wert 5. Pack den Ausdruck in bool(), wenn du ein echtes True oder False brauchst.
Was ist der Unterschied zwischen and und & in Python?
and und & in Python?and ist ein logischer Operator: Er prüft den Wahrheitswert und wertet mit Kurzschluss aus. & ist ein bitweiser Operator: Bei Ganzzahlen verknüpft er Bits (6 & 3 ist 2), bei Sets bildet er die Schnittmenge, und er wertet immer beide Seiten aus. Nimm and in if-Bedingungen. Die Ausnahme sind NumPy und pandas, wo & das elementweise Und ist.
Was wird in Python zuerst ausgeführt, and oder or?
not bindet am stärksten, dann and, dann or. a or b and c bedeutet also a or (b and c), und not a or b bedeutet (not a) or b. Vergleiche wie == und < binden stärker als alle drei.
Kann ich in Python && und || verwenden?
Nein. && und || sind in Python ein SyntaxError. Die logischen Operatoren sind die Wörter and, or und not. Ein einzelnes & oder | ist gültig, bedeutet aber etwas anderes (bitweises Und/Oder).