In diesem Lernprogramm erfahren Sie, wie sich Vorrang und Assoziativität von Operatoren auf die Reihenfolge der Operationen in Python auswirken.
Vorrang von Python-Operatoren
Die Kombination von Werten, Variablen, Operatoren und Funktionsaufrufen wird als Ausdruck bezeichnet. Der Python-Interpreter kann einen gültigen Ausdruck auswerten.
Beispielsweise:
>>> 5 - 7 -2
Hier 5 - 7
ist ein Ausdruck. Ein Ausdruck kann mehr als einen Operator enthalten.
Um diese Arten von Ausdrücken auszuwerten, gibt es in Python eine Vorrangregel. Es gibt die Reihenfolge an, in der diese Vorgänge ausgeführt werden.
Beispielsweise hat die Multiplikation eine höhere Priorität als die Subtraktion.
# Multiplication has higher precedence # than subtraction >>> 10 - 4 * 2 2
Wir können diese Reihenfolge jedoch in Klammern ändern, ()
da sie eine höhere Priorität als die Multiplikation hat.
# Parentheses () has higher precedence >>> (10 - 4) * 2 12
Die Operatorrangfolge in Python ist in der folgenden Tabelle aufgeführt. Es ist in absteigender Reihenfolge (obere Gruppe hat höhere Priorität als die untere).
Betreiber | Bedeutung |
---|---|
() | Klammern |
** | Exponent |
+x , -x ,~x | Unäres Plus, Unäres Minus, Bitweises NICHT |
* , / , // ,% | Multiplikation, Division, Bodenteilung, Modul |
+ , - | Addition Subtraktion |
<< , >> | Bitweise Verschiebungsoperatoren |
& | Bitweises UND |
^ | Bitweises XOR |
| | Bitweises ODER |
== , != , > , >= , < , <= , is , is not , in ,not in | Vergleiche, Identität, Mitgliedschaftsbetreiber |
not | Logisch NICHT |
and | Logisches UND |
or | Logisches ODER |
Schauen wir uns einige Beispiele an:
Angenommen, wir bauen einen if… else
Block, der ausgeführt wird, if
wenn das Mittagessen entweder Obst oder Sandwich ist und nur, wenn das Geld mehr als oder gleich 2 ist.
# Precedence of or & and meal = "fruit" money = 0 if meal == "fruit" or meal == "sandwich" and money>= 2: print("Lunch being delivered") else: print("Can't deliver lunch")
Ausgabe
Mittagessen wird geliefert
Dieses Programm führt einen if
Block aus, selbst wenn Geld 0 ist. Es gibt uns nicht die gewünschte Ausgabe, da die Priorität von and
höher als ist or
.
Wir können die gewünschte Ausgabe erhalten, indem wir ()
die folgenden Klammern verwenden :
# Precedence of or & and meal = "fruit" money = 0 if (meal == "fruit" or meal == "sandwich") and money>= 2: print("Lunch being delivered") else: print("Can't deliver lunch")
Ausgabe
Ich kann kein Mittagessen liefern
Assoziativität von Python-Operatoren
In der obigen Tabelle sehen wir, dass mehr als ein Operator in derselben Gruppe vorhanden ist. Diese Operatoren haben die gleiche Priorität.
Wenn zwei Operatoren dieselbe Priorität haben, hilft die Assoziativität bei der Bestimmung der Reihenfolge der Operationen.
Assoziativität ist die Reihenfolge, in der ein Ausdruck ausgewertet wird, der mehrere Operatoren mit derselben Priorität hat. Fast alle Operatoren haben eine Assoziativität von links nach rechts.
Zum Beispiel haben Multiplikation und Bodenteilung die gleiche Priorität. Wenn also beide in einem Ausdruck vorhanden sind, wird der linke zuerst ausgewertet.
# Left-right associativity # Output: 3 print(5 * 2 // 3) # Shows left-right associativity # Output: 0 print(5 * (2 // 3))
Ausgabe
3 0
Hinweis : Der Exponentenoperator **
hat in Python eine Assoziativität von rechts nach links.
# Shows the right-left associativity of ** # Output: 512, Since 2**(3**2) = 2**9 print(2 ** 3 ** 2) # If 2 needs to be exponated fisrt, need to use () # Output: 64 print((2 ** 3) ** 2)
Wir können sehen, dass 2 ** 3 ** 2
das gleichbedeutend ist mit 2 ** (3 ** 2)
.
Nicht assoziative Operatoren
Einige Operatoren wie Zuweisungsoperatoren und Vergleichsoperatoren haben in Python keine Assoziativität. Es gibt separate Regeln für Sequenzen dieser Art von Operatoren und können nicht als Assoziativität ausgedrückt werden.
Zum Beispiel x < y < z
bedeutet weder (x < y) < z
noch x < (y < z)
. x < y < z
ist äquivalent zu x < y and y < z
und wird von links nach rechts ausgewertet.
Während die Verkettung von Zuweisungen wie x = y = z = 1
vollkommen gültig ist, x = y = z+= 2
führt dies zu Fehlern.
# Initialize x, y, z x = y = z = 1 # Expression is invalid # (Non-associative operators) # SyntaxError: invalid syntax x = y = z+= 2
Ausgabe
Datei "", Zeile 8 x = y = z + = 2 SyntaxError: ungültige Syntax