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 aclarar esto por mí?
python
python-3.x
boolean-expression
Akshar Gupta
fuente
fuente
Respuestas:
NO, Y, O, de mayor a menor según la documentación sobre la precedencia del operador
Aquí está la tabla de precedencia completa, de menor a mayor precedencia. Una fila tiene la misma precedencia y encadena 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...}
fuente
**
tiene algunas excepciones señaladas en una nota al pie cuando se trata de la precedencia sobre los operadores aritméticos.**
operador no tiene precedencia sobre las operaciones aritméticas, pero tiene a su izquierda ... Por ejemplo5*2**2 == 5*(2**2)
,. Sin embargo, es correcto decir eso2**-1 == 2**(-1)
.int
literal, pero cuando se analiza conast
no es el caso, esUnaryOp
conUSub
y1
como operando. La verdadera razón es que no hay otra forma de analizarlo. Es decir,2**
no es un operando izquierdo correcto para binario menos. Por lo tanto, "excepción de prioridad de exponenciación", pero "solo a la derecha".Puede realizar la siguiente prueba para averiguar la precedencia de
and
yor
.Primero, intente
0 and 0 or 1
en la consola de PythonSi se
or
une primero, lo esperaríamos0
como salida.En mi consola,
1
está la salida. Significaand
que se une primero o igual aor
(tal vez las expresiones se evalúen de izquierda a derecha).Entonces inténtalo
1 or 0 and 0
.Si
or
y seand
enlazan igualmente con el orden de evaluación integrado de izquierda a derecha, entonces deberíamos obtener0
como salida.En mi consola,
1
está la salida. Entonces podemos concluir queand
tiene mayor prioridad queor
.fuente
((0 and 0) or 1)
y(1 or (0 and 0))
(0 and 0)
nunca se evalúa como(exp1 or exp2)
retorno directo siexp1
esTrue
. De manera similar, en la primera expresión, laand 0
parte nunca se evalúa comoexp1 and exp2
retorno directo siexp1
esFalse
.not
se une más fuerte que loand
que se une más fuerte queor
como se indica en la referencia del lenguajefuente
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.
fuente
and
¬ x
se evalúa de izquierda a derecha) es técnicamente equivalente al efecto oficial, pero eso es simplemente porque cuando está en "cond1 y no cont2", Python tiene que calcular cont2 primero por defecto.or
yand
parece estar en la misma celda usando Firefox pero no Opera . La diferencia en la precedencia entreor
yand
es obvia (por ejemplo,1 or 0 and 0
vs(1 or 0) and 0
) que entreand
ynot x
no tanto por la razón que usted da. Repararé mi respuesta para reflejar lo que realmente dice la documentación .No hay una buena razón para que Python tenga otra secuencia de prioridad de esos operadores que una bien establecida en (casi) todos los demás lenguajes de programación, incluido C / C ++.
Puede encontrarlo en The Python Language Reference , parte 6.16 - Precedencia del operador, descargable (para la versión actual y empaquetado con toda la demás documentación estándar) de https://docs.python.org/3/download.html , o leerlo en línea aquí: 6.16. Precedencia del operador .
Pero todavía hay algo en Python que puede engañarlo: el resultado de los operadores
and
yor
puede ser diferente deTrue
oFalse
- vea 6.11 Operaciones booleanas en el mismo documento.fuente
Algunos ejemplos sencillos; observe 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
Similar:
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
fuente