Soweit ich weiß, ist in C & C ++ die Prioritätssequenz für NOT AND & OR NOT> AND> OR. In Python scheint dies jedoch nicht ähnlich zu funktionieren. Ich habe versucht, in der Python-Dokumentation danach zu suchen, und bin gescheitert (ich glaube, ich bin etwas ungeduldig.). Kann jemand das für mich klären?
python
python-3.x
boolean-expression
Akshar Gupta
quelle
quelle
Antworten:
Es ist NICHT UND UND ODER vom höchsten zum niedrigsten gemäß der Dokumentation zur Priorität des Bedieners
Hier ist die vollständige Prioritätstabelle, niedrigste Priorität bis höchste. Eine Zeile hat die gleiche Priorität und Ketten von links nach rechts
0. := 1. lambda 2. if – else 3. or 4. and 5. not x 6. in, not in, is, is not, <, <=, >, >=, !=, == 7. | 8. ^ 9. & 10. <<, >> 11. +, - 12. *, @, /, //, % 13. +x, -x, ~x 14. ** 14. await x 15. x[index], x[index:index], x(arguments...), x.attribute 16. (expressions...), [expressions...], {key: value...}, {expressions...}
quelle
**
in einer Fußnote einige Ausnahmen aufgeführt sind, wenn es um den Vorrang vor arithmetischen Operatoren geht.**
Operator keinen Vorrang vor arithmetischen Operationen, aber auf der linken Seite ... Zum Beispiel5*2**2 == 5*(2**2)
. Es ist jedoch richtig, das zu sagen2**-1 == 2**(-1)
.int
Literal ist, aber wenn man es mit analysiert, istast
es nicht der Fall - es istUnaryOp
mitUSub
und1
als Operand. Der wahre Grund ist, dass es keinen anderen Weg gibt, es zu analysieren. Dh2**
ist kein korrekter linker Operand für binäres Minus. Also "Exponentiationsprioritätsausnahme", aber "nur rechts".Sie können den folgenden Test durchführen, um die Priorität von
and
und herauszufindenor
.Erster Versuch
0 and 0 or 1
in der Python-KonsoleWenn
or
zuerst bindet, dann würden wir erwarten0
als Ausgabe .In meiner Konsole
1
ist die Ausgabe. Dies bedeutet, dassand
entweder zuerst oder gleichor
gebunden wird (möglicherweise werden Ausdrücke von links nach rechts ausgewertet).Dann versuchen Sie es
1 or 0 and 0
.Wenn
or
undand
binden Sie gleichermaßen mit der eingebauten Bewertungsreihenfolge von links nach rechts, dann sollten wir0
als Ausgabe erhalten.In meiner Konsole
1
ist die Ausgabe. Dann können wir daraus schließen, dass diesand
eine höhere Priorität hat alsor
.quelle
((0 and 0) or 1)
(1 or (0 and 0))
(0 and 0)
jedoch niemals als(exp1 or exp2)
direkt zurückgegeben ausgewertet, wenn dies der Fallexp1
istTrue
. In ähnlicher Weise wird derand 0
Teil im ersten Ausdruck niemals alsexp1 and exp2
direkt zurückgegeben ausgewertet, wenn dies der Fallexp1
istFalse
.not
bindet enger als das,and
was fester bindet alsor
in der Sprachreferenz angegebenquelle
Von den booleschen Operatoren hat die Priorität von der schwächsten zur stärksten folgende:
or
and
not x
is not
;;not in
Bei gleichrangigen Operatoren erfolgt die Auswertung von links nach rechts.
quelle
and
¬ x
von links nach rechts bewertet & bewertet) technisch dem offiziellen Effekt, aber das liegt einfach daran, dass Python in "cond1 und nicht cont2" standardmäßig zuerst cont2 berechnen muss.or
undand
scheinen Sie mit Firefox in derselben Zelle zu sein, aber nicht mit Opera . Der Unterschied in der Priorität zwischenor
undand
ist offensichtlich (z. B.1 or 0 and 0
vs(1 or 0) and 0
), dass zwischenand
undnot x
nicht so sehr aus dem von Ihnen angegebenen Grund. Ich werde meine Antwort reparieren, um zu reflektieren, was in der Dokumentation tatsächlich steht.Es gibt keinen guten Grund für Python, eine andere Prioritätssequenz dieser Operatoren als eine gut etablierte zu haben in (fast) allen anderen Programmiersprachen, einschließlich C / C ++.
Sie finden es möglicherweise in The Python Language Reference , Teil 6.16 - Operator Priority, herunterladbar (für die aktuelle Version und zusammen mit allen anderen Standarddokumentationen) unter https://docs.python.org/3/download.html oder lesen Sie es online hier: 6.16. Vorrang des Bedieners .
Aber es gibt noch etwas in Python , die Sie täuschen kann: Das Ergebnis von
and
undor
Betreiber können unterschiedlich vonTrue
oderFalse
- siehe 6.11 Boolesche Operationen im selben Dokument.quelle
Einige einfache Beispiele; Beachten Sie die Priorität des Operators (nicht, und, oder). Klammern, um die Interpretierbarkeit des Menschen zu unterstützen.
a = 'apple' b = 'banana' c = 'carrots' if c == 'carrots' and a == 'apple' and b == 'BELGIUM': print('True') else: print('False') # False
Ähnlich:
if b == 'banana' True if c == 'CANADA' and a == 'apple' False if c == 'CANADA' or a == 'apple' True if c == 'carrots' and a == 'apple' or b == 'BELGIUM' True # Note this one, which might surprise you: if c == 'CANADA' and a == 'apple' or b == 'banana' True # ... it is the same as: if (c == 'CANADA' and a == 'apple') or b == 'banana': True if c == 'CANADA' and (a == 'apple' or b == 'banana'): False if c == 'CANADA' and a == 'apple' or b == 'BELGIUM' False if c == 'CANADA' or a == 'apple' and b == 'banana' True if c == 'CANADA' or (a == 'apple' and b == 'banana') True if (c == 'carrots' and a == 'apple') or b == 'BELGIUM' True if c == 'carrots' and (a == 'apple' or b == 'BELGIUM') True if a == 'apple' and b == 'banana' or c == 'CANADA' True if (a == 'apple' and b == 'banana') or c == 'CANADA' True if a == 'apple' and (b == 'banana' or c == 'CANADA') True if a == 'apple' and (b == 'banana' and c == 'CANADA') False if a == 'apple' or (b == 'banana' and c == 'CANADA') True
quelle