O ile wiem, w C i C ++ priorytetem dla NOT AND & OR jest NOT> AND> OR. Ale to nie wydaje się działać w podobny sposób w Pythonie. Próbowałem go poszukać w dokumentacji Pythona i nie udało mi się (chyba jestem trochę niecierpliwy). Czy ktoś może mi to wyjaśnić?
python
python-3.x
boolean-expression
Akshar Gupta
źródło
źródło
Odpowiedzi:
To NIE, AND, OR, od najwyższego do najniższego, zgodnie z dokumentacją dotyczącą pierwszeństwa operatorów
Oto pełna tabela priorytetów, od najniższego do najwyższego. Wiersz ma ten sam priorytet i łańcuchy od lewej do prawej
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...}
źródło
**
w przypisie podano pewne wyjątki, jeśli chodzi o pierwszeństwo przed operatorami arytmetycznymi.**
operator nie ma pierwszeństwa przed operacjami arytmetycznymi, ale ma po lewej ... Na przykład5*2**2 == 5*(2**2)
. Jednak słusznie to powiedzieć2**-1 == 2**(-1)
.int
dosłowne, ale podczas analizowania go zast
nią nie jest to przypadek - toUnaryOp
zUSub
a1
jako argumentu. Prawdziwym powodem jest to, że nie ma innego sposobu, aby go przeanalizować. To2**
znaczy nie jest poprawnym lewym operandem dla binarnego minus. Tak więc „wyjątek priorytetu potęgowania”, ale „tylko po prawej”.Możesz wykonać następujący test, aby ustalić pierwszeństwo
and
ior
.Najpierw spróbuj
0 and 0 or 1
w konsoli PythonaJeśli
or
łączy się najpierw, spodziewalibyśmy się, że0
jako dane wyjściowe.W mojej konsoli
1
jest wyjście. Oznacza toand
, że wiąże się jako pierwsze lub równeor
(być może wyrażenia są oceniane od lewej do prawej).Następnie spróbuj
1 or 0 and 0
.Jeśli
or
iand
powiążemy jednakowo z wbudowaną kolejnością oceny od lewej do prawej, powinniśmy otrzymać0
wynik.W mojej konsoli
1
jest wyjście. Następnie możemy stwierdzić, żeand
ma wyższy priorytet niżor
.źródło
((0 and 0) or 1)
i(1 or (0 and 0))
(0 and 0)
argument nigdy nie jest oceniany jako(exp1 or exp2)
bezpośrednio zwracany, jeśliexp1
jestTrue
. Podobnie w pierwszym wyrażeniuand 0
część nigdy nie jest oceniana jakoexp1 and exp2
bezpośrednio zwracana, jeśliexp1
jestFalse
.not
wiąże mocniej niż toand
wiąże mocniej niżor
podano w odwołaniu do językaźródło
Wśród operatorów logicznych pierwszeństwo, od najsłabszego do najsilniejszego, jest następujące:
or
and
not x
is not
;not in
Tam, gdzie operatory mają równy priorytet, ocena przebiega od lewej do prawej.
źródło
and
¬ x
jest oceniana od lewej do prawej) jest technicznie równoważna z oficjalnym efektem, ale dzieje się tak po prostu dlatego, że gdy w "cond1, a nie cont2", Python musi domyślnie najpierw obliczyć cont2.or
iand
wydaje się, że znajduje się w tej samej komórce przy użyciu przeglądarki Firefox, ale nie Opery . Różnica w pierwszeństwie międzyor
iand
jest oczywista (np.1 or 0 and 0
Vs(1 or 0) and 0
), że międzyand
inot x
nie tak bardzo z powodu, który podajesz. Naprawię swoją odpowiedź, aby odzwierciedlić to, co faktycznie mówi dokumentacja .Nie ma dobrego powodu, aby Python miał inną priorytetową sekwencję tych operatorów niż dobrze ugruntowana w (prawie) wszystkich innych językach programowania, w tym C / C ++.
Możesz go znaleźć w The Python Language Reference , część 6.16 - Pierwszeństwo operatorów, do pobrania (dla bieżącej wersji i spakowanej z całą inną standardową dokumentacją) z https://docs.python.org/3/download.html lub przeczytaj go online tutaj: 6.16. Pierwszeństwo operatorów .
Jednak w Pythonie jest jeszcze coś, co może zmylić: wynik operacji
and
ior
może być inny niż operatoryTrue
orFalse
- patrz 6.11 Operacje logiczne w tym samym dokumencie.źródło
Kilka prostych przykładów; zwróć uwagę na pierwszeństwo operatora (nie, i lub); stosuj nawiasy, aby ułatwić interpretację przez człowieka.
a = 'apple' b = 'banana' c = 'carrots' if c == 'carrots' and a == 'apple' and b == 'BELGIUM': print('True') else: print('False') # False
Podobnie:
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
źródło