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%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 .
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
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.
Tags und Links python order precedence