¿Soporta Python cortocircuito?
-
24-09-2019 - |
Pregunta
¿Soporta Python cortocircuito en expresiones booleanas?
Solución
Sí, tanto and
y operadores or
cortocircuito - ver los docs .
Otros consejos
El cortocircuito en and
operador, or
:
Vamos a definir primero una función útil para determinar si se ejecuta o no algo. Una simple función que acepta un argumento, imprime un mensaje y devuelve la entrada, sin cambios.
>>> def fun(i):
... print "executed"
... return i
...
Se puede observar cortocircuitos del de Python comportamiento de and
, los operadores or
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: Los siguientes valores son considerados por el intérprete en false media:
False None 0 "" () [] {}
comportamiento El cortocircuito de la función: any()
, all()
:
any()
y funciones all()
también apoyan cortocircuitos. Como se muestra en la documentación; evalúan cada elemento de una secuencia en orden, hasta encontrar un resultado que permite una salida temprana en la evaluación. Considere los ejemplos siguientes para entender ambos.
La función any()
comprueba si cualquier elemento es True. Se deja de ejecutarse en cuanto se encuentre 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 todos los elementos son True y deja de ejecutarse como pronto como se detecta un falso:
>>> 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 El cortocircuito en encadenada Comparación:
Además, en Python
Las comparaciones se pueden encadenar arbitrariamente ; por ejemplo,
x < y <= z
es equivalente ax < y and y <= z
, excepto que se evalúay
sólo una vez (pero en ambos casosz
no se evalúa en absoluto cuandox < y
se encuentra que es falsa).
>>> 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
Un punto más interesante nota - Lógico and
, los operadores or
en Python devuelve valor de un operando en lugar de un valor booleano (True
o False
). Por ejemplo:
Operación
x and y
da laif x is false, then x, else y
resultado
A diferencia de en otros idiomas, por ejemplo, &&
, los operadores ||
en C que el retorno o bien 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
retorno operador mismo modo or
dejó la mayor valor para el que bool(value)
== True
otro valor derecho más falsa (de acuerdo con el comportamiento de corto circuito), los 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 Práctico Por Python Magnus Lie Hetland:
Digamos que un usuario se supone que debe introducir su nombre, pero pueden optar por ingresar nada, en cuyo caso se desea utilizar la '<unknown>'
valor predeterminado. Se podría utilizar un if, pero también podría decir las cosas de manera muy sucinta:
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 verdad (no es una cadena vacía), que es cedidad para el nombre (nada cambia); de lo contrario, el '<unknown>'
por defecto se asigna a name
.
Sí. Pruebe lo siguiente en el 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