Prioridad de los operadores lógicos (orden de operaciones) para NOT, AND, OR en Python

5 minutos de lectura

Avatar de usuario de Akshar Gupta
Akshar Gupta

Hasta donde yo sé, en C & C++, la secuencia de prioridad para NOT AND & OR es NOT>AND>OR. Pero esto no parece funcionar de manera similar en Python. Intenté buscarlo en la documentación de Python y fallé (supongo que estoy un poco impaciente). ¿Alguien puede aclararme esto?

  • ¿Puedes dar un ejemplo en el que la precedencia del operador no funcione como crees?

    – esquivar la apisonadora

    21 mayo 2013 a las 22:51

  • no es mayor que y es mayor que o

    – CtrlAltF2

    6 de mayo de 2019 a las 2:27

Avatar de usuario de Kyle Heuton
kyle heuton

NO es, Y, O, de mayor a menor de acuerdo con la documentación en
Precedencia del operador

Aquí está la tabla de precedencia completa, de la precedencia más baja a la más alta. Una fila tiene la misma precedencia y cadenas de izquierda a derecha

 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...}

  • Tenga en cuenta que ** tiene algunas excepciones señaladas en una nota al pie cuando se trata de la precedencia sobre los operadores aritméticos.

    – Martijn Pieters

    21 mayo 2013 a las 21:09

  • Esto confunde al matemático que hay en mí: en aritmética, diríamos que tiene precedencia sobre los operadores aritméticos. A su derecha, el ** El operador no tiene precedencia sobre las operaciones aritméticas, pero tiene a su izquierda… Por ejemplo, 5*2**2 == 5*(2**2). Sin embargo, es correcto decir que 2**-1 == 2**(-1).

    – PhilMacKay

    5 sep 2018 a las 13:51


  • @PhilMacKay: podría parecer que, por ejemplo, el signo menos es parte del int literal, pero al analizarlo con ast no es el caso – es UnaryOp con USub y 1 como operando. La verdadera razón es que no hay otra forma de analizarlo. Es decir 2** no es un operando izquierdo correcto para menos binario. Por lo tanto, “excepción de prioridad de exponenciación”, pero “solo a la derecha”.

    – Tomasz Gandor

    28 oct 2019 a las 16:38

Puedes hacer la siguiente prueba para averiguar la precedencia de and y or.

Primer intento 0 and 0 or 1 en la consola de python

Si or se une primero, entonces esperaríamos 0 como salida.

En mi consola, 1 es la salida. Significa and se une primero o es igual a or (tal vez las expresiones se evalúan de izquierda a derecha).

Entonces intenta 1 or 0 and 0.

Si or y and vincular igualmente con el orden de evaluación integrado de izquierda a derecha, entonces deberíamos obtener 0 como salida.

En mi consola, 1 es la salida. Entonces podemos concluir que and tiene mayor prioridad que or.

  • Más explícitamente, las expresiones se evalúan como: ((0 and 0) or 1) y (1 or (0 and 0))

    – Conquilicultor

    17 de diciembre de 2019 a las 23:08

  • Sin embargo, en la segunda expresión, la (0 and 0) nunca se evalúa como (exp1 or exp2) devolver directamente si exp1 es True. De manera similar en la primera expresión, la and 0 parte nunca se evalúa como exp1 and exp2 devolver directamente si exp1 es False.

    – Conquilicultor

    17 dic 2019 a las 23:25

not se une más fuerte que and que se une más fuerte que or como se indica en el referencia idiomática

Avatar de usuario de Oswald Wirt
Osvaldo Wirt

De los operadores booleanos, la precedencia, del más débil al más fuerte, es la siguiente:

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

Cuando los operadores tienen la misma precedencia, la evaluación procede de izquierda a derecha.

Avatar de usuario de Victoria Stuart
Victoria Estuardo

Algunos ejemplos simples; tenga en cuenta la precedencia del operador (no, y, o); entre paréntesis para ayudar a la interpretación humana.

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

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

Similarmente:

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

Hay sin una buena razón para que Python tenga otro secuencia de prioridad de esos operadores que uno bien establecido en (casi) todos los demás lenguajes de programación, incluido C/C++.

Puedes encontrarlo en La referencia del lenguaje Pythonparte 6.16 – Precedencia de operadores, descargable (para la versión actual y empaquetado con toda la documentación estándar) desde https://docs.python.org/3/download.htmlO léelo en línea aquí: 6.16. Precedencia del operador.

Pero todavía hay algo en Python que puede confundirte: el resultado de and y or los operadores pueden ser diferente de True o False – ver 6.11 Operaciones booleanas en el mismo documento.

Avatar de usuario de Yas
ya

not > and

print(~0&0) # 0

and > or

print(0&0|1) # 1

¿Ha sido útil esta solución?