Booleanos, operaciones lógicas y binarias

Booleanos, operaciones lógicas y binarias



Este artículo es una traducción de Notes about booleans and logical operators escrito por Thomas Cokelaer.

El tipo booleano

Una expresión booleana (o expresión lógica) es evaluada como verdadera (true) o falsa (false). Python provee el tipo de dato booleano que puede contener los valores True o False. Muchas funciones y operaciones retornan objetos booleanos.

La palabra reservada not puede ser utilizada para invertir un valor booleano.

>>> not True
False

¿Qué es falso?

Todo objeto en Python tiene un valor booleano. Los siguientes elementos se evalúan como False:

  • None
  • False
  • 0 (sea un entero o un número de coma flotante).
  • Colecciones vacías (cadenas, tuplas, listas y diccionarios – "", (,), [], {}).
  • Instancias de clases que contengan el método especial __nonzero__().
  • Instancias de clases que implementen __len__() para retornar False o cero.

Ejemplo de una clase que se evalúa como False:

>>> class A():
...     def __len__(self):
...         return 0
...
>>> class B():
...     def __nonzero__(self):
...         return 0
...
>>> a = A()
>>> bool(a)
False
>>> b = B()
>>> bool(b)
False

El resto de los objetos se evalúan como True.

Operadores de comparación

Los operadores <, <=, >, >=, == y != comparan el valor de dos objetos y retornan True o False. La comparación depende del tipo de los objetos. Véase este enlace (en inglés) para saber cómo redefinir el operador de comparación de una clase.

>>> 10 == 10
True
>>> 5 < 3
False

Encadenando los operadores de comparación

Los operadores comparativos pueden encadenarse. Considera los siguientes ejemplos:

>>> x = 2
>>> 1 < x < 3
True
>>> 10 < x < 20
False
>>> 3 > x <= 2
True
>>> 2 == x < 4
True

La comparación es efectuada entre cada par de los términos a evaluar. Así, en el primer ejemplo, Python primero evalúa 1 < x y luego x < 3. Si ambos son verdaderos, entonces el resultado de la comparación también lo es. De esto se deduce que a < b < c es equivalente a (a < b) and (b < c), lo cual difiere del comportamiento de otros lenguajes en los que dicha expresión sería considerada como (a < b) < c.

Evaluación de las operaciones lógicas

La evaluación de una expresión al utilizar los operadores and u or sigue las siguientes reglas:

  • and y or evalúan una expresión de izquierda a derecha.
  • La operación and, si todos los valores son True, retorna el último en ser evaluado. Si algún valor es falso, retorna el primero.
  • or retorna el primer valor que sea True. Si todos son False, retorna el último.
Operador Descripción
not x Retorna True si x es True; False en caso contrario.
x and y Retorna x si x es False; y en caso contrario.
x or y Retorna y si x es False; x en caso contrario.

Operadores de pertenencia

  • in se evalúa como True si se encuentra un objeto en una determinada colección (cadenas, listas, tuplas, etc.); False en caso contrario.
  • not in es la negación de lo anterior.

>>> "buen" in "este es un buen ejemplo"
True
>>> "buen" not in "este es un buen ejemplo"
False

Operadores de identidad

>>> a = "hola"
>>> b = a
>>> b is a
True
>>> a = [1, 2, 3]
>>> b = [1, 2, 3]
>>> a is b
False

Operadores binarios

Los operadores binarios son empleados para comparar números enteros en su representación binaria. Así, la operación binaria and entre los enteros 5 y 4 se realiza en realidad entre los números binarios 101 y 100.

Operador binario Descripción
>> Desplazamiento (shift) izquierdo
<< Desplazamiento (shift) derecho
& and binario
^ xor (or exclusivo) binario
| or binario
~ not binario

Las operaciones de desplazamiento binario pueden dividir o multiplicar por potencias de 2 fácilmente (la conversión a número entero es implícita):

>>> 25 >> 2
6
>>> 25 << 2
100

Nótese que si un desplazamiento excede 2^31, la operación elimina los bits restantes y cambia el signo.

El operador not funciona da la siguiente manera:

>>> ~38
-39
>>> ~-38
37

Orden de evaluación

La siguiente tabla muestra el orden de evaluación de los operadores desde los primeros en evaluarse hasta los últimos. Por ejemplo, la multiplicación está antes que la adición, porque en la expresión 7 * 2 + 5 primero se evalúa 7 * 2 y luego 14 + 5.

Operadores Descripción
(), [], {}, "" Tuplas, listas, diccionarios y cadenas
x.attr, x[], x[i:j], f() Atributos, índices, slicing y llamadas a funciones
+x, -x, ~x Negación unaria e inversión/negación binaria
** Potenciación
*, /, % Multiplicación, división y resto
+, - Adición y substración
<<, >> Desplazamiento binario
& and binario
^ xor (or exclusivo) binario
| or binario
<, <=, >=, >, ==, !=, is, is not, in, not in Operadores de comparación, pertenencia e identidad
not Negación lógica
and Conjunción lógica
or Disyunción lógica
lambda Expresión lambda

A continuación la tabla de prioridad para los operadores booleanos únicamente:

Operador
==
!=
and
or

Evaluaciones de cortocircuito

Para agilizar las operaciones lógicas, Python utiliza evaluaciones de cortocircuito. Esto quiere decir que únicamente se evalúan las expresiones que sean necesarias. Por ejemplo, la siguiente expresión es siempre falsa.

>>> False and b
False

Por ende, b nunca es evaluado. Incluso podría no haber sido definido y aun así Python no lanzaría ningún error.

Valores de retorno

En las operaciones lógicas, el valor de retorno es el último que ha sido evaluado. Por ejemplo:

>>> print (True and "OK" or "KO")
OK
>>> print (False and "OK" or "KO")
KO

En la primera expresión, True and "OK" es verdadero. No hay necesidad de evaluar or "KO", por lo que allí termina la operación lógica y el valor de retorno es el último que ha sido evaluado en True and "OK".

En la segunda expresión, False and "OK" es falso. Por ende, or "KO" tiene que ser evaluado. Así, la última expresión evaluada es "KO" y constituye el valor de retorno.

Prioridad

Considera la siguiente expresión:

>>> True and False or True
True

Ya que and tiene prioridad, la primera evaluación es True and False, que siempre es falsa. La segunda evaluación se convierte entonces en False or True, que es verdadero.

No obstante tal vez ayude añadir paréntesis para hacer explícita la prioridad de evaluación y no cometer equivocaciones (además, mejora la legibilidad):

>>> (True and False) or True
True



Deja un comentario