Operaciones booleanas

Estoy confundido sobre cómo Python evalúa las declaraciones booleanas.

Por ej.

False and 2 or 3 

devuelve 3

¿Cómo se evalúa esto? Pensé que Python primero ve ‘Falso y 2’, y devuelve False sin siquiera mirar ‘o 3’. ¿Cuál es el orden de lo que Python ve aquí?

Otro es:

 1 or False and 2 or 2 and 0 or 0 

devuelve 1

De lo que obtuve del primer ejemplo, pensé que Python evaluaría de izquierda a derecha, por lo que ‘1 o False’ devolvería 1, luego ‘1 y 2’ devolverían 2, luego ‘2 o 2’ devolverían los primeros 2 , entonces ‘2 y 0’ devolverían 0, luego ‘0 o 0’ devolverían el segundo 0.

Como pueden ver, estoy bastante perplejo, por favor, ¡ayúdenme!

¡Gracias!

and tiene mayor precedencia que or .

 False and 2 or 3 

se evalúa como

 ((False and 2) or 3) 

Dado que la primera parte (False and 2) es False , Python tiene que evaluar la segunda parte para ver si la condición completa aún puede ser True o no. Puede, ya que 3 evalúa como True por lo que se devuelve este operando.

Similar para 1 or False and 2 or 2 and 0 or 0 que se evalúa como

 (1 or ((False and 2) or ((2 and 0) or 0))) 

Como 1 evalúa como True , toda la condición será True , independientemente del valor que tengan los otros operandos. Python puede dejar de evaluar en este punto y, de nuevo, devuelve el operando que determina el valor final.

La detención tan pronto como se determina el resultado final se denomina evaluación de cortocircuito y se puede describir de la siguiente manera:

Cuando se determina el resultado final de la expresión, la evaluación se detiene y en Python se devuelve el valor del operando que determina el valor final. Es decir, asumiendo una evaluación de izquierda a derecha:

  • para el operador and , el operando más a la izquierda que se evalúa como False (o el último)
  • para el operador or , el operando más a la izquierda que se evalúa como True (o el último)

Consulte la sección 5.15 de esta página: http://docs.python.org/reference/expressions.html

or tiene una precedencia más baja que and , por lo que su statement se evalúa como

 (false and 2) or 3 

El problema aquí es que hay un orden de evaluación and tiene una prioridad más alta que or . Como tal, se evalúan de izquierda a derecha aquí.

Dado esto, False and 2 or 3 es, para python, (False and 2) or 3 , por lo que se evalúa como False or True , luego como True .

En su siguiente ejemplo, Python cortocircuita, por lo que 1 or False evalúa como True como 1 , y por lo tanto devuelve 1 . El rest nunca se evalúa. Esto tiene sentido como si una parte de un or True , sabes que todo debe ser así, ¿por qué molestarse en hacer un trabajo extra?

Una buena manera de verificar esto es definir las funciones que imprimen:

 >>> def test(x): ... print("Test: "+str(x)) ... return x ... >>> test(1) or test(0) or test(3) Test: 1 1 >>> test(0) or test(0) or test(3) Test: 0 Test: 0 Test: 3 3 >>> test(False) and test(2) or test(3) Test: False Test: 3 3 >>> test(1) or test(False) and test(2) or test(2) and test(0) or test(0) Test: 1 1 

Esto facilita ver qué se evalúa y en qué orden.

Leí sobre esto hace un tiempo atrás en la página de documentos de python. Si lo encuentro, publicaré la referencia. Declaró algo en la línea de, en una statement booleana, Python devolverá el primer objeto True. Por lo tanto … el y fue prefigurado con Falso, pero el o solo tuvo un argumento, que fue 3 (Verdadero).

Se evalúa así:

 result = (False and 2) or 3 

Entonces, básicamente, si False and 2 es verdadero, entonces se devuelve, de lo contrario se devuelve 3 .