Was ist die Rechtfertigung für Pythons Energieversorger auf der rechten Seite?

9

Ich schreibe Code, um Zeichenfolgen für mathematische Ausdrücke zu analysieren, und habe festgestellt, dass die Reihenfolge, in der verkettete Potenzoperatoren in Python ausgewertet werden, von der Reihenfolge in Excel abweicht.

Von http://docs.python.org/reference/expressions.html :

"Somit werden in einer nicht parästhesierten Folge von Potenz- und unären Operatoren die Operatoren von rechts nach links ausgewertet (dies schränkt die Auswertungsreihenfolge für die Operanden nicht ein): -1 * 2 ergibt -1." *

Dies bedeutet, dass in Python: 2**2**3als ausgewertet wird2**(2**3) = 2**8 = 256

In Excel funktioniert es umgekehrt: 2^2^3wird als ausgewertet(2^2)^3 = 4^3 = 64

Ich muss jetzt eine Implementierung für meinen eigenen Parser auswählen. Die Excel-Reihenfolge ist einfacher zu implementieren, da sie die Bewertungsreihenfolge der Multiplikation widerspiegelt.

Ich fragte einige Leute im Büro, wie sie sich für die Bewertung fühlten, 2^2^3und bekam gemischte Antworten.

Kennt jemand gute Gründe oder Überlegungen für die Python-Implementierung? Und wenn Sie keine Antwort haben, kommentieren Sie bitte das Ergebnis, das Sie aus dem Bauchgefühl erhalten - 64oder 256?

Pieter Müller
quelle
Es ist nicht viel schwieriger zu implementieren. Auf jeden Fall muss Ihr Parser die richtige Assoziativität auf die eine oder andere Weise für Dinge wie die Zuweisung unterstützen.
Marco-Fiset
Ja, das ist es nicht, ich habe es tatsächlich implementiert. Ich habe mich jedoch wieder der Excel-Konvention zugewandt, da eine der Hauptanwendungen meiner Bibliothek darin besteht, Gleichungen nach Excel zu exportieren. Daher ist es sinnvoller, sich an die Funktionsweise der Gleichungen dort zu halten.
Pieter Müller

Antworten:

10

Der Grund, warum in der Mathematik gestapelte Exponenten von oben nach unten angewendet werden, ist, dass Sie auf die andere Weise nur die Multiplikation von Exponenten erhalten:

(((2^3)^4)^5) = 2^(3 * 4 * 5)
Andrea
quelle
Es ist nicht klar Form Ihre Antwort .... aber ist das nicht , wie Exponenten arbeiten in diesem Zusammenhang? ((2 ^ 3) ^ 4) = 8 ^ 4 = (2 ^ 3) * (2 ^ 3) * (2 ^ 3) * (2 ^ 3) = 2 ^ (3 + 3 + 3 + 3) = 2 ^ 12
Pureferret
3
Ja, so ist es. Mein Punkt ist, dass von den zwei Ordnungen, die Sie auswählen können, eine etwas ergibt, das Sie schreiben können, ohne Exponenten zu stapeln. Die interessante Assoziativität ist also die andere.
Andrea
14

Wikipedia (und mein Mathematiklehrer) sagen mir: Gestapelte Exponenten werden von oben nach unten angewendet.

Dies spiegelt sich in der Art und Weise wider, wie Python es bewertet. Microsoft ist falsch (noch einmal)

Und Ruby bewertet es als Python, also ist es ohne Zweifel richtig, da Matz nicht falsch liegen kann.

thorsten müller
quelle
4
Siehe auch diesen interessanten Beitrag zur Implementierung des Operators in D-Sprache, der die richtige Assoziativität unterstützt.
Pedro Romano
Ich erinnere mich, dass Visual Basic es auf die gleiche Weise bewertet hat, bin mir aber nicht sicher, ob dies dieser Methode Glaubwürdigkeit verleiht. ;)
Xion
Microsoft ist nur dann "falsch", wenn es einer Spezifikation, die es zu befolgen behauptet, nicht entspricht. Verschiedene Sprachen bewerten mathematische Operationen unterschiedlich. Wenn ich mich richtig erinnere, hat APL alle Operationen rechtsassoziativ gemacht. Inkonsistenzen mit einer anderen Spezifikation sind ärgerlich, aber nicht unbedingt "falsch".
Keith Thompson