Operadores logicos en Python

Mientras leía los operadores lógicos en python encontré expresiones:

5 and 1 

salida: 1

  5 or 1 

salida: 5

¿Alguien puede explicar cómo funciona esto?
Sé que los operandos de los operadores lógicos son booleanos.

eso está bien documentado :

 x or y if x is false, then y, else xx and y if x is false, then x, else y 

ambos cortocircuitos (por ejemplo, or no evaluarán y si x es veraz ).

la documentación también indica lo que se considera falsa ( False , 0 , None , secuencias / asignaciones vacías, …): todo lo demás se considera veraz .

Algunos ejemplos:

 7 and 'a' # -> 'a' [] or None # -> None {'a': 1} or 'abc'[5] # -> {'a': 1}; no IndexError raised from 'abc'[5] False and 'abc'[5] # -> False; no IndexError raised from 'abc'[5] 

observe cómo los dos últimos muestran el comportamiento de cortocircuito: la segunda instrucción (que generaría un IndexError ) no se ejecuta.

su statement de que los operandos son booleanos es un poco discutible. python tiene booleanos (en realidad solo 2 de ellos: True y False ; son subtipos de int ). pero las operaciones lógicas en Python solo verifican si los operandos son veraces o falsos . La función bool no se llama en los operandos.


los términos verdad y falsedad no parecen usarse en la documentación oficial de python. pero los libros que enseñan python y la comunidad aquí usan estos términos. hay una discusión sobre los términos en english.stackexchange.com y también una mención en wikipedia .

Esto se debe al método de evaluación de cortocircuito.

Para la and , todas las cláusulas deben ser True , por lo que todas deben ser evaluadas. Una vez que se encuentra un False , todo se evalúa como False , ni siquiera necesitamos evaluar los siguientes.

 >>> 1 y 2
 2
 >>> 2 y 1
 1
 >>> 1 y 2 y 3
 3
 >>> 1 y 0 y 2
 0
 >>> 0 y 1 y 2
 0

Pero para or , cualquiera de las cláusulas que se evalúan como True es suficiente para que todo sea True . Entonces, una vez que encuentra que algo es True , el valor de todo se decide a ser True , sin siquiera evaluar las cláusulas subsiguientes.

 >>> 0 o 1
 1
 >>> 1 o 0
 1
 >>> 1 o 2
 1
 >>> 2 o 1
 2
 >>> 0 o 0 o 1
 1
 >>> 0 o 1 o 2
 1

Esto se llama cortocircuito o evaluación perezosa. Por ejemplo, si tiene “aob” y cumple los criterios, a continuación, python lo generará. A la inversa, si tiene “a y b” y “a” no cumple con los criterios, entonces Python dejará de evaluarla ya que no se puede satisfacer.

En el primer caso cuando la palabra clave y está allí, es el segundo valor el que determina si es lógicamente cierto o no, siempre que el primer número sea distinto de cero. Así se imprime el segundo valor eventualmente.

En el segundo caso, la palabra clave es más o menos cuando se encuentra el primer operando distinto de cero, ya que hace que la afirmación sea lógicamente verdadera, se imprime en la pantalla de salida.

Es un ejemplo de evaluación perezosa.