Priorität des Python-Operators

8

Python-Dokumente sagen, dass * und / die gleiche Priorität haben.
Ich weiß, dass Ausdrücke in Python von links nach rechts ausgewertet werden.

Darf ich mich darauf verlassen und annehmen, dass j j / m immer gleich (j j) / m ist die Klammern vermeiden? Wenn dies der Fall ist, kann ich annehmen, dass dies für Operatoren mit der gleichen Priorität im Allgemeinen gilt?

ps: Die Frage, wie es für meine Zwecke in Ordnung ist, Ich kam zu ihm beim Lesen von Integer-Code (wie im obigen Beispiel) ohne Klammern, was mir damals sehr verdächtig erschien.

    
Lord British 25.07.2010, 06:54
quelle

3 Antworten

14

Ja - verschiedene Operatoren mit derselben Priorität sind linksassoziativ; das heißt, die beiden am weitesten links stehenden Elemente werden bearbeitet, dann das Ergebnis und das dritte Element und so weiter.

Eine Ausnahme ist der Operator ** :

%Vor%

Außerdem verhalten sich Vergleichsoperatoren ( == , > usw.) nicht assoziativ, sondern übersetzen x [cmp] y [cmp] z in (x [cmp] y) and (y [cmp] z) .

    
Amber 25.07.2010, 06:56
quelle
13

Aber, wenn es für Sie zweideutig ist - der Kodierer - und es muss sein, weil Sie fragen müssen, dann erwarten Sie, dass es für den Leser mindestens genauso zweideutig sein wird und ein paar Oktetts für Klarheit verschwenden.

Sich auf Vorrangregeln zu verlassen, ist großartig, wenn Sie ein Compiler sind.

Antworten auf Kommentare hinzugefügt :

Für die Person, die Code liest, der auf eine Mehrdeutigkeit stößt, die eine externe Beratung erfordert, sollten Sie davon ausgehen, dass der nächste Leser weniger klug ist als Sie und ihnen den Aufwand und den vermeidbaren menschlichen Fehler ersparen, dasselbe Konstrukt zu analysieren und die Klammern hinzuzufügen für Sie.

Zufällig war sogar die angenommene Antwort falsch (in der Begründung, nicht in der Wirkung, siehe den ersten Kommentar), die mir nicht bewusst war, und auch nicht ein Bruchteil derer, die sie revidierten.

Was die Aussage über die grundlegende Algebra betrifft, so ist das im OP verwendete Beispiel instruktiv. Unabhängig von der Operator-Priorität ist der Ausdruck j * (j / m) algebraisch identisch mit (j * j) / m . Unglücklicherweise ist die Python-Algebra nur eine Annäherung an die "Platonische Ideal" -Algebra, die in Abhängigkeit von den Größen j und m falsche Antworten für beide Formen liefern könnte. Zum Beispiel:

%Vor%

Also stimmt die Identitätseigenschaft von Pythons (und meiner FPU) Quasi-Algebra nicht. Dies kann auf Ihrem Computer anders sein als die Dokumentation :

  

Fließkommazahlen sind implementiert   mit Doppel in C. Alle Wetten auf ihre   Präzision ist ausgeschaltet, es sei denn, Sie passieren   kenne die Maschine mit der du arbeitest.

Es könnte behauptet werden, dass man an der haarigen Kante des Überlaufs keine Arbeit hat, und das stimmt bis zu einem gewissen Grad, aber aus dem Kontext entfernt ist der Ausdruck unbestimmt in einer Reihenfolge von Operationen und "richtig" unter einer anderen.

    
msw 25.07.2010 07:29
quelle
3

Kurze Antwort: ja.

Die Python-Dokumentation sagt Folgendes:

  

Operatoren in derselben Box haben die gleiche Priorität. Wenn die Syntax nicht explizit angegeben ist, sind Operatoren binär. Operatoren in der gleichen Boxgruppe von links nach rechts (mit Ausnahme von Vergleichen, einschließlich Tests, die alle die gleiche Priorität und Kette von links nach rechts haben ... und Potenzierung, welche Gruppen von rechts nach links).

Mit anderen Worten, die Antwort auf Ihre Frage lautet "ja", Operatoren mit derselben Priorität werden von links nach rechts getrennt von Vergleiche, die eine Kette und keine Gruppe :

%Vor%

und Exponentation:

%Vor%

Auch bei der Zuweisung wird die rechte Seite vor der linken Seite ausgewertet:

%Vor%     
Dave Webb 25.07.2010 07:20
quelle

Tags und Links