Saltar al contenido principal

Evaluación de expresiones lógicas

Cuando Python está procesando una expresión lógica, como x>=2 and (x/y > 2), evalúa la expresión de izquierda a derecha. Debido a la definición de and, si x es menor que 2, la expresión x>=2 resulta ser falsa. De manera que la expresión completa ya va a ser falsa, independientemente de si (x/y) > 2 se evalúa como verdadera o falsa.

Cuando Python detecta que no se gana nada evaluando el resto de una expresión lógica, detiene su evaluación y no realiza el cálculo del resto de la expresión. Cuando la evaluación de una expresión lógica se detiene debido a que ya se conoce el valor final, esto se conoce como circuito corto en la evaluación.

A pesar de que esto pueda parecer muy fino, este funcionamiento nos descubre una ingeniosa técnica conocida como patrón guardián.

x = 6
y = 2
x >= 2 and (x/y) > 2 # True
x = 1
y = 0
x >= 2 and (x/y) > 2 # False
x = 6
y = 0
x >= 2 and (x/y) > 2
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ZeroDivisionError: division by zero

La tercera operación falla porque Python intentó evaluar (x/y) y y era cero, lo cual provoca un error en tiempo de ejecución. Pero el segundo ejemplo no falló porque la primera parte de la expresión fue evaluada como falsa, y por lo tanto (x/y) no se llegó a ejecutar debido a la regla del circuito corto.

Es posible construir expresiones lógicas colocando estratégicamente una evaluación como guardián justo antes de la evaluación que podría causar un error, como se muestra a continuación:

x = 1
y = 0
x >= 2 and y != 0 and (x/y) > 2 # False
x = 6
y = 0
x >= 2 and y != 0 and (x/y) > 2 # False
x >= 2 and (x/y) > 2 and y != 0
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ZeroDivisionError: division by zero

En la primera expresión lógica, x>=2 es falsa, así que la evaluación se detiene en el primer and. En la segunda expresión lógica, x >= 2 es verdadera, pero y != 0 es falsa, de manera que nunca se alcanza (x/y).

En la tercera expresión lógica, el y != 0 se evalúa después del cálculo (x/y), de manera que la expresión falla.

En la segunda expresión, se dice que y != 0 actúa como guardián para garantizar que solo se ejecute (x/y) en el caso de que y no sea cero.