2012-05-06 11 views
7

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

Por ej.

False and 2 or 3 

retornos 3

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

Otra es:

1 or False and 2 or 2 and 0 or 0 

devuelve 1

De lo que he reunido desde el primer ejemplo, pensé Python evaluaría de izquierda a derecha, por lo que '1 o Falso' devolvería 1, a continuación, '1 y 2' devolverían 2, luego '2 o 2' devolverían los primeros 2, luego '2 y 0' devolverían 0, luego '0 o 0' devolverían el segundo 0.

Como pueden Dile que estoy bastante perplejo, ¡por favor ayuda!

Gracias!

Respuesta

9

and tiene mayor prioridad que or.

False and 2 or 3 

se evalúa como

((False and 2) or 3) 

Desde la primera parte (False and 2) es False, Python tiene que evaluado la segunda parte para ver si toda la condición todavía puede convertirse en True o no. Puede, ya que 3 evalúa a True por lo que este operando es devuelto.

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

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

Desde 1 evalúa a True, toda la condición será True, no importa qué valor tienen los otros operandos.Python puede dejar de evaluar en este punto y nuevamente, devuelve el operando que determina el valor final.

Detener tan pronto como el resultado final se determina que se llama short-circuit evaluation y puede ser descrito como sigue:

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

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

Ah, así que cualquier comparación con y debe incluirse entre paréntesis. Eso tiene mucho más sentido. ¿Cómo supo hacer (1 o (((Falso y 2) o (2 y 0)) o 0)) en lugar de (1 o (Falso y 2) o (2 y 0) o 0)? – kkSlider

+1

@kkSlider Solo si necesita cambiar el orden de precedencia, o quiere hacerlo más claro, al igual que en las matemáticas normales. El exceso de horquillado hará que su código sea menos claro. En cuanto a tu ejemplo. es una cuestión de cuál es la lógica para su situación. –

+0

@kkSlider: No tiene por qué ser así si no quiere hacer cumplir un cierto orden. Pero tiene que hacerlo si desea evaluar la expresión como 'False and (2 or 3)'. * editar: * lo que dijo @Lattyware :) –

3

El problema aquí es que hay una orden de evaluación, y and has a higher precedence than or. Como tal, se evalúan de izquierda a derecha aquí.

Teniendo en cuenta esto, es False and 2 or 3, a pitón, (False and 2) or 3 - por lo que se evalúa como False or True, a continuación, a True.

En el ejemplo siguiente, Python cortocircuitos, por lo 1 or False evalúa a True como 1 hace, y por lo tanto vuelve 1. El resto nunca se evalúa. Esto tiene sentido como si la parte de un or fuera True, usted sabe que todo debe ser así, entonces ¿para qué molestarse en hacer un trabajo extra?

Una buena manera de comprobar esto es definir las funciones que se 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 hace que sea fácil de ver lo que se evalúa, y en qué orden.

2

He leído sobre este hace un tiempo en la página documentación de Python. Si lo encuentro, publicaré la referencia. Estableció algo en la línea de, en una declaración booleana, Python devolverá el primer objeto True. Por lo tanto .... el y fue falsificado previamente con False, pero el o solo tenía un argumento, que era 3 (Verdadero).

+0

Tuve un error al escribir aquí, pero sí, como otros lo han mencionado, el primer paso es el orden de precedencia booleana, y el siguiente es que Python no devolverá solo un valor True o Falso para el enunciado, pero el valor real (que podría tener un valor verdadero o falso). – jheld

2

Se evalúa así:

result = (False and 2) or 3 

Así que, básicamente, si es cierto False and 2-ish, entonces se devuelve, de lo contrario se devuelve 3.

Cuestiones relacionadas