python short-circuiting

¿Python soporta cortocircuitos?



short-circuiting (3)

Comportamiento de cortocircuito en el operador and , or :

Primero definamos una función útil para determinar si algo se ejecuta o no. Una función simple que acepta un argumento, imprime un mensaje y devuelve la entrada, sin cambios.

>>> def fun(i): ... print "executed" ... return i ...

Se puede observar el comportamiento de cortocircuito del Python de and , or operadores en el siguiente ejemplo:

>>> fun(1) executed 1 >>> 1 or fun(1) # due to short-circuiting "executed" not printed 1 >>> 1 and fun(1) # fun(1) called and "executed" printed executed 1 >>> 0 and fun(1) # due to short-circuiting "executed" not printed 0

Nota: El intérprete considera que los siguientes valores son falsos:

False None 0 "" () [] {}

Comportamiento de cortocircuito en la función: any() , all() :

Las funciones any() y all() Python también admiten cortocircuitos. Como se muestra en los documentos; evalúan cada elemento de una secuencia en orden, hasta encontrar un resultado que permita una salida temprana en la evaluación. Considera los siguientes ejemplos para entender ambos.

La función any() verifica si algún elemento es verdadero. Deja de ejecutarse tan pronto como se encuentra un verdadero y devuelve verdadero.

>>> any(fun(i) for i in [1, 2, 3, 4]) # bool(1) = True executed True >>> any(fun(i) for i in [0, 2, 3, 4]) executed # bool(0) = False executed # bool(2) = True True >>> any(fun(i) for i in [0, 0, 3, 4]) executed executed executed True

La función all() comprueba que todos los elementos son True y deja de ejecutarse tan pronto como se encuentra un False:

>>> all(fun(i) for i in [0, 0, 3, 4]) executed False >>> all(fun(i) for i in [1, 0, 3, 4]) executed executed False

Comportamiento de cortocircuito en comparación encadenada:

Adicionalmente, en Python.

Las comparaciones pueden ser encadenadas arbitrariamente ; por ejemplo, x < y <= z es equivalente a x < y and y <= z , excepto que y se evalúa solo una vez (pero en ambos casos z no se evalúa en absoluto cuando se encuentra que x < y es falso).

>>> 5 > 6 > fun(3) # same as: 5 > 6 and 6 > fun(3) False # 5 > 6 is False so fun() not called and "executed" NOT printed >>> 5 < 6 > fun(3) # 5 < 6 is True executed # fun(3) called and "executed" printed True >>> 4 <= 6 > fun(7) # 4 <= 6 is True executed # fun(3) called and "executed" printed False >>> 5 < fun(6) < 3 # only prints "executed" once executed False >>> 5 < fun(6) and fun(6) < 3 # prints "executed" twice, because the second part executes it again executed executed False

Editar:
Otro punto interesante a tener en cuenta : - Los operadores lógicos and / or en Python devuelven el valor de un operando en lugar de un booleano ( True o False ). Por ejemplo:

La operación x and y da el resultado if x is false, then x, else y

A diferencia de otros idiomas, por ejemplo, && , || Operadores en C que devuelven 0 o 1.

Ejemplos:

>>> 3 and 5 # Second operand evaluated and returned 5 >>> 3 and () () >>> () and 5 # Second operand NOT evaluated as first operand () is false () # so first operand returned

De manera similar, or operador devuelve el valor más a la izquierda para el que bool(value) == True o derecha o más falso (según el comportamiento de cortocircuito), ejemplos:

>>> 2 or 5 # left most operand bool(2) == True 2 >>> 0 or 5 # bool(0) == False and bool(5) == True 5 >>> 0 or () ()

Entonces, ¿cómo es esto útil? Un ejemplo de uso dado en Practical Python Por Magnus Lie Hetland:
Supongamos que un usuario debe ingresar su nombre, pero puede optar por no ingresar nada, en cuyo caso desea usar el valor predeterminado ''<unknown>'' . Podría usar una declaración if, pero también podría declarar las cosas muy sucintamente:

In [171]: name = raw_input(''Enter Name: '') or ''<Unkown>'' Enter Name: In [172]: name Out[172]: ''<Unkown>''

En otras palabras, si el valor de retorno de raw_input es verdadero (no una cadena vacía), se le asigna un nombre (nada cambia); de lo contrario, se asigna el name ''<unknown>'' al name .

¿Python soporta cortocircuito en expresiones booleanas?


Sí. Pruebe lo siguiente en su intérprete de python:

y

>>>False and 3/0 False >>>True and 3/0 ZeroDivisionError: integer division or modulo by zero

o

>>>True or 3/0 True >>>False or 3/0 ZeroDivisionError: integer division or modulo by zero