Python - seltsames / unerwartetes Verhalten - Vorrang von Operatoren

7

Ich habe kürzlich ein wenig mit Python-Generatoren experimentiert und bin auf das folgende seltsame Verhalten gestoßen, und ich bin neugierig zu verstehen, warum das passiert und was passiert:

%Vor%

Ausgabe:

%Vor%

Im Vergleich zum folgenden Skript, das die erwartete Ausgabe generiert:

%Vor%

Ausgabe:

%Vor%     
Alexander Marquardt 07.08.2012, 14:10
quelle

3 Antworten

20

Das hat nichts mit Generatoren zu tun:

%Vor%

Der % op wird vor der Multiplikation ausgeführt, wobei der String und der erste a als Argumente verwendet werden. Ihr a**2 funktioniert, weil der ** op mit a und 2 als Argumente vor dem % ausgewertet wird.

    
DSM 07.08.2012, 14:12
quelle
8

Pythons Reihenfolge der Operationen ist von links nach rechts, außer wo PEMDAS gilt. Der String-Interpolationsoperator hat offensichtlich den gleichen Vorrang wie Modulo und Multiplikation, denn wenn Sie die Reihenfolge umkehren, wird die Multiplikation links von der Interpolation gemacht, sie hat Vorrang:

%Vor%

Wie Sie jedoch bereits gezeigt haben, übertrumpft die Potenzierung die Reihenfolge von links nach rechts.

Update: In dem selben Dokument unter Binary Arithmetic Operations steht etwas denotativ Offensichtliches , aber konnotativ relevant:

  

... der% Operator wird auch von String- und Unicode-Objekten überladen   Führen Sie eine String-Formatierung durch (auch bekannt als Interpolation).

Während Ihnen das anscheinend nur sagt, was der % Operator macht , sagen seine Position und sein Kontext Ihnen auch, dass es den gleichen Vorrang hat, ob es als modulo oder interpolieren .

    
kojiro 07.08.2012 14:21
quelle
5

Wenn Sie unerwartetes Verhalten beobachten, starten Sie Ihre Analyse, indem Sie sie auf den einfachsten Fall herunterrechnen. Ein einfacher Fall wird leichter zu studieren und zu verstehen sein.

Das unerwartete Verhalten:

%Vor%

(Sie haben 'hello 6' erwartet)

Wir raten Python, den Befehl als 'hello 3' * 2 und nicht als 'hello %d' % 6 zu interpretieren. Wir versuchen, die zweite Interpretation mit Klammern zu erzwingen

%Vor%

Eureka!

Wir haben gezeigt, dass der Operator für die Zeichenfolgenformatierung % eine größere oder gleiche Priorität hat als die Multiplikation. Wir überprüfen die Python-Dokumentation - ja, es bestätigt dies Ссылка

Um zu bestätigen, dass die Priorität gleich ist, können wir es anders herum versuchen:

%Vor%

Nachdem wir gesehen haben, dass das Komma (,) dupliziert ist, gehen wir davon aus, dass die Multiplikation "%d," * 2 vor der String-Formatierung % durchgeführt wurde. Wenn die Multiplikation der Zeichenfolgenformatierung vorangehen kann und die Zeichenfolgenformatierung der Multiplikation vorangestellt wird, müssen sie in ihrer Priorität gleich sein.

    
Colonel Panic 07.08.2012 14:34
quelle

Tags und Links