HOWTO · Python

Reihenfolge der Operationen in Python

Dieses Tutorial behandelt die Ausführungsreihenfolge von Operatoren in Python, einschließlich der Operatorpräzedenz, der arithmetischen Operatoren, der logischen Operatoren und der Verwendung von Klammern zur Verdeutlichung. Erlangen Sie ein solides Verständnis davon, wie Python Ausdrücke auswertet, um besseren Code zu schreiben und häufige Fallstricke zu vermeiden.

Auf dieser Seite

Python wertet Operatoren gemäß ihrer Präzedenz aus, sodass Multiplikation und Division stärker binden als Addition und Subtraktion. Um ein Ergebnis vorherzusagen, gruppieren Sie den Ausdruck nach der Präzedenz und berücksichtigen Sie dann die Assoziativität und etwaige kurzschließende logische Operatoren. Klammern machen die beabsichtigte Gruppierung explizit.

Was ist Operatorpräzedenz?

Die Operatorpräzedenz ist die Priorität, die Python verwendet, um Teile eines Ausdrucks zu gruppieren. Sie beschreibt die Gruppierung, nicht einen universellen Ausführungsablauf von links nach rechts: Die Assoziativität bestimmt, wie Operatoren mit derselben Präzedenz gruppieren, und Python wertet Operanden in ihrer festgelegten Reihenfolge aus. Zum Beispiel gruppiert 3 + 4 * 2 als 3 + (4 * 2) und hat den Wert 11.

Die folgende Referenz listet gängige Python-Operatoren von höherer zu niedrigerer Präzedenz auf. Operatoren in derselben Zeile teilen sich eine Präzedenzstufe; verwenden Sie die Assoziativitätsregeln oder Klammern, um ihre Gruppierung zu bestimmen.

Präzedenz, von hoch zu niedrig Operatoren oder Ausdrücke
Gruppierung und Zugriff (expressions), x[index], x(...), x.attribute
Await await x
Potenzierung **
Unär numerisch und bitweise +x, -x, ~x
Multiplikation *, @, /, //, %
Addition +, -
Verschiebungen <<, >>
Bitweises AND &
Bitweises XOR ^
Bitweises OR `
Vergleiche und Zugehörigkeits-/Identitätstests <, <=, >, >=, !=, ==, in, not in, is, is not
Boolesches NOT not x
Boolesches AND and
Boolesches OR or
Bedingungsausdruck x if condition else y
Lambda lambda
Zuweisungsausdruck :=

Dies ist eine praktische Referenz für die hier besprochenen Operatoren, keine vollständige Grammatik jeder Ausdrucksform. PEMDAS ist eine vertraute arithmetische Eselsbrücke, beschreibt aber nicht alle Python-Operatoren und ersetzt die obigen Präzedenzregeln nicht. Die Potenzierung gruppiert außerdem von rechts nach links, sodass 2 ** 3 ** 2 für 2 ** (3 ** 2) steht. Unäre Vorzeichen und die Potenzierung stehen in einer besonderen Beziehung: -2 ** 2 gruppiert als -(2 ** 2).

Grundlegende arithmetische Operatoren

In der Arithmetik gruppieren Klammern zuerst; dann folgt die Potenzierung; dann Multiplikation, Division, ganzzahlige Division und Modulo; schließlich Addition und Subtraktion. Multiplikation und Division haben gleiche Präzedenz und assoziieren von links nach rechts, ebenso Addition und Subtraktion. Der Operator / führt eine echte Division aus, sodass das Dividieren von ganzen Zahlen eine Gleitkommazahl ergeben kann.

Führen Sie dieses Beispiel aus:

a = 10
b = 5
c = 2

mixed = a + b * c - a / b
explicit = (a + b) * c - a / b
print(mixed)
print(explicit)

Der erste Ausdruck gruppiert als 10 + (5 * 2) - (10 / 5); der zweite gruppiert als (10 + 5) * 2 - (10 / 5). Die Divisionen erzeugen Gleitkommawerte, sodass die Endergebnisse Gleitkommazahlen sind. Dieses Beispiel wurde nicht ausgeführt, daher wird seine Ausgabe hier nicht gezeigt.

Dieselben Regeln erklären 10 + 2 / 2: Die Division wird zuerst gruppiert, sodass der Wert 11 ist. Python wählt die Addition nicht zuerst, nur weil sie im Ausdruck zuerst erscheint.

Klammern zur Klarheit verwenden

Klammern legen die Gruppierung fest und können ein Ergebnis verändern. Im obigen Beispiel wird (a + b) vor der Multiplikation gruppiert, was die Arithmetik gegenüber dem Ausdruck ohne Klammern verändert. Fügen Sie Klammern hinzu, wenn sie die beabsichtigte Berechnung verdeutlichen, auch wenn Pythons Standardpräzedenz bereits dieselbe Gruppierung ergeben würde.

Klammern steuern die Gruppierung; sie bedeuten nicht, dass jeder Teil des Ausdrucks eifrig ausgewertet wird. Python folgt weiterhin der Semantik jedes Operators, einschließlich des Kurzschlussverhaltens von and und or.

Vergleichs- und logische Operatoren

Vergleiche wie ==, !=, <, <=, > und >= haben eine höhere Präzedenz als not, and und or. Klammern helfen zu zeigen, welche Vergleiche in einen logischen Ausdruck einfließen. Zum Beispiel verbindet (10 > 5) and (15 > 10) zwei wahre Vergleiche, sodass der Ausdruck wahr ist.

not gilt für den Ausdruck, der ihm folgt, und bindet stärker als and; and bindet stärker als or. Sowohl and als auch or schließen kurz: Python kann die Auswertung des rechten Operanden überspringen, wenn der linke Operand das Ergebnis bestimmt. Sie geben außerdem einen ihrer Operanden zurück, statt immer einen booleschen Wert zurückzugeben. In einer Bedingung behandelt Python den resultierenden Wert gemäß seinem Wahrheitswert.

Für eine lesbare Bedingung schreiben Sie explizite Gruppierungen wie (age >= 18) and (has_ticket or is_guest). Dies macht die beabsichtigte Beziehung klar und hilft zu verhindern, dass eine Präzedenzregel mit der Geschäftsregel verwechselt wird.

Verkettete Vergleiche

Python unterstützt Vergleichsketten wie 10 > 5 > 15. Dies entspricht im Ergebnis 10 > 5 and 5 > 15, wobei der mittlere Ausdruck nur einmal ausgewertet wird. Der erste Vergleich ist wahr und der zweite falsch, sodass die ganze Kette falsch ist. Python vergleicht nicht das boolesche Ergebnis von 10 > 5 mit 15.

Eine Kette ist nützlich für Bereichsprüfungen: 0 <= score <= 100 erfordert, dass beide Vergleiche wahr sind. Wenn die Vergleiche unterschiedliche Ausdrücke betreffen oder der mittlere Wert mehr als einmal ausgewertet werden sollte, schreiben Sie die beabsichtigten Vergleiche explizit und verwenden Sie eine temporäre Variable, wo dies die Klarheit verbessert.

Fazit

Um einen Python-Ausdruck vorherzusagen, wenden Sie die Operatorpräzedenzregeln an, prüfen Sie die Assoziativität, wenn Operatoren eine Stufe teilen, und berücksichtigen Sie Verhalten wie das Kurzschließen. Verwenden Sie Klammern, um die beabsichtigte Gruppierung zu vermitteln. Diese Gewohnheiten machen arithmetische und bedingte Ausdrücke leichter lesbar und leichter zu debuggen.

FAQ

  1. Was ist Operatorpräzedenz in Python?

    Sie ist die Priorität, die Python verwendet, um Operatoren in einem Ausdruck zu gruppieren. Die Assoziativität und die Semantik jedes Operators beeinflussen ebenfalls, wie der Ausdruck ausgewertet wird.

  2. Wie kann ich die Gruppierung eines Ausdrucks ändern?

    Setzen Sie Klammern um den Teilausdruck, der zuerst gruppiert werden soll, wie in (a + b) * c.

  3. Was passiert, wenn Operatoren dieselbe Präzedenz haben?

    Es hängt vom Operator ab. Die meisten Operatoren gruppieren von links nach rechts, die Potenzierung gruppiert von rechts nach links, und Vergleiche können eine Kette bilden. Fügen Sie Klammern hinzu, wenn die Gruppierung unklar sein könnte.

  4. Was, wenn ich bei einem komplexen Ausdruck Klammern weglasse?

    Python wendet seine definierten Präzedenz- und Assoziativitätsregeln an. Wenn diese Gruppierung schwer zu erkennen ist, fügen Sie Klammern hinzu, um die beabsichtigte Berechnung klar zu machen.

  5. Kann ich Vergleichsoperatoren verketten?

    Ja. Eine Kette wie 0 <= score <= 100 prüft beide Vergleiche und wertet den mittleren Ausdruck einmal aus.