Пріоритет логічних операторів NOT AND & OR в python


82

Наскільки мені відомо, в C & C ++ пріоритетна послідовність для NOT AND & OR - це NOT> AND> OR. Але це, схоже, не працює подібним чином у Python. Я спробував пошукати його в документації Python, але не вдалося (мабуть, я трохи нетерплячий.). Хтось може це мені пояснити?


2
Чи можете ви навести приклад, коли пріоритет оператора працює не так, як ви думаєте?
dodgethesteamroller

не більше і більше ніж або
CtrlAltF2

Відповіді:


95

Це НЕ, І, АБО, від найвищого до найнижчого відповідно до документації про пріоритет оператора

Ось повна таблиця пріоритетів, від найнижчого до найвищого. Рядок має однаковий пріоритет і ланцюжки зліва направо

 0. :=
 1. lambda
 2. ifelse
 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...}

1
Зверніть увагу, що **у виносці є деякі винятки, коли йдеться про перевагу над арифметичними операторами.
Мартін Пітерс

1
Це бентежить математика в мені: в арифметиці ми б сказали, що вона має перевагу над арифметичними операторами. На його справа, **оператор не має пріоритету над арифметичними операціями, але він має на своєму лівому ... Наприклад, 5*2**2 == 5*(2**2). Однак правильно сказати це 2**-1 == 2**(-1).
PhilMacKay

@PhilMacKay - може здатися, що, наприклад, мінус є частиною intлітералу, але при синтаксичному аналізі це astне так - це за UnaryOpдопомогою USubі 1як операнд. Справжня причина полягає в тому, що немає іншого способу проаналізувати його. Тобто 2**не є правильним лівим операндом для двійкового мінусу. Таким чином, "виняток пріоритету піднесення до степенізації", але "лише справа".
Томаш

32

Ви можете виконати наступний тест, щоб з’ясувати перевагу andтаor .

Спочатку спробуйте 0 and 0 or 1 в консолі python

Якщо orперше пов'язує, то ми могли б очікувати0 як вихід.

На моїй консолі 1є вихід. Це означає andабо прив'язується першим, або дорівнюєor (можливо, вирази обчислюються зліва направо).

Тоді спробуй 1 or 0 and 0.

Якщо orі andпов'язуємо однаково із вбудованим порядком оцінки зліва направо, тоді ми повинні отримати0 як результат.

На моїй консолі 1є вихід. Тоді ми можемо зробити висновок, що andмає вищий пріоритет, ніж or.


3
Більш чітко, вирази оцінюються як: ((0 and 0) or 1)а(1 or (0 and 0))
Conchylicultor

1
Однак у другому виразі значення (0 and 0)ніколи не оцінюється як (exp1 or exp2)безпосереднє повернення, якщо exp1є True. Подібним чином у першому виразі and 0частина ніколи не оцінюється як exp1 and exp2безпосередньо повертається, якщо exp1є False.
Conchylicultor


4

З булевих операторів пріоритет, від найслабшого до найсильнішого, такий:

  1. or
  2. and
  3. not x
  4. is not; not in

Там, де оператори мають однаковий пріоритет, оцінка здійснюється зліва направо.


Вибачте, ваш номер 2 технічно правильний, але все одно дуже оманливий. Перш за все, документ, здається, не змінюється. По-друге, ваша думка №2 (пропозиція andта not xоцінюється зліва направо) технічно еквівалентна офіційному ефекту, але це просто тому, що коли в "cond1, а не cont2", python повинен обчислити cont2 спочатку за замовчуванням.
RayLuo

Дякую @RayLuo, але це навіть не було технічно правильно. Я вкладав значення в неправильно відтворені рядки, що розділяють рядки в цій таблиці. Дивлячись на 2.7 док сьогодні or і , як andвидається, в одній камері з допомогою Firefox , але не опера . Різниця в пріоритеті між orі andочевидна (наприклад, 1 or 0 and 0проти (1 or 0) and 0), що між andі not xне стільки з причини, яку ви вказали. Я відновлю свою відповідь, щоб відобразити те, що насправді сказано в документації .
Освальд Вірт

2

Немає вагомих причин для того, щоб Python мав іншу пріоритетну послідовність цих операторів, ніж добре встановлену в (майже) всіх інших мовах програмування, включаючи C / C ++.

Ви можете знайти його в Довідковому мові Python , частина 6.16 - Пріоритет оператора, який можна завантажити (для поточної версії та упакованого з усією іншою стандартною документацією) з https://docs.python.org/3/download.html або прочитати онлайн тут: 6.16. Пріоритет оператора .

Але є ще що - то в Python , які можуть ввести в оману вас: результат від andі orоператори можуть бути різними від Trueабо False- см 6.11 логічні операції в тому ж документі.


1

Кілька простих прикладів; зверніть увагу на пріоритет оператора (не, і, або); дужки, щоб допомогти людині зрозуміти.

a = 'apple'
b = 'banana'
c = 'carrots'

if c == 'carrots' and a == 'apple' and b == 'BELGIUM':
    print('True')
else:
    print('False')
# False

Аналогічно:

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.