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?
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 que2**-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 conast
no es el caso – esUnaryOp
conUSub
y1
como operando. La verdadera razón es que no hay otra forma de analizarlo. Es decir2**
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 siexp1
esTrue
. De manera similar en la primera expresión, laand 0
parte nunca se evalúa comoexp1 and exp2
devolver directamente siexp1
esFalse
.– 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
Osvaldo Wirt
De los operadores booleanos, la precedencia, del más débil al más fuerte, es la siguiente:
or
and
not x
is not
;not in
Cuando los operadores tienen la misma precedencia, la evaluación procede de izquierda a derecha.
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.
ya
not
> and
print(~0&0) # 0
and
> or
print(0&0|1) # 1
¿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