Booleanos#

Existen dos objetos de tipo booleano bool

  • True

  • False

ya hemos visto anteriormente funciones que devuelven valores booleanos como isinstance o los operadores is o ==.

type(True)
bool
isinstance(False, bool)
True

Operaciones lógicas#

Python incluye operadores estándar para realizar operaciones lógicas básicas

Operador Lógico

Operador Simbólico

and

&

or

|

not

True or False
True
True and False
False
not False
True

A la hora de evaluar un operador lógico, Python hace los cálculos necesarios para computar el argumento izquierdo y, en caso de ser necesario, evalúa el argumento derecho.

Los operadores simbólicos se comportan igual que su correspondiente operador lógico cuando los utilizamos con booleanos. Sin embargo, estos operadores también se emplean para representar operaciones a nivel de bits. Por ejemplo, el & representa el bitwise-and

2 & 1
0

es bastante común encontarse con resultados inesperados cuando se utilizan estos operadores, ya que por ejemplo tienen un orden de evaluación distinto. Por ello, siempre que sea posible, intentaremos usar los operadores lógicos, lo que se considera un estilo más pythónico. Sin embargo, no se puede definir un comportamiento especial para los operadores lógicos and y or cuando definamos nuestras clases, de ahí que sea necesario usar los operadores & y | en paquetes como numpy o pandas.

El orden de preferencia con los operadores lógicos es el siguiente: not > and > or

False and True or True
True

Para alterar el orden de preferencia en Python podemos utilizar parétesis

False and (True or True)
False

Los operadores de comparación usuales también devuelven booleanos y tienen preferencia frente a los operadores lógicos. No está mal añadir paréntesis redundantes si ayuda a legibilidad de la expresión

2 < 3
True
10.5 >= 4.7
True
(2 < 4) and not (4 != -1)
False

Los booleanos son enteros#

En realidad el tipo booleano es un caso particular de entero, o más precisamente es una subclase.

isinstance(True, int)
True
int(True)
1
int(False)
0

Como tales, podemos usarlos en operaciones matemáticas de forma totalmente intercambiable por los enteros 0 y 1.

3*True - False
3
True / False
---------------------------------------------------------------------------
ZeroDivisionError                         Traceback (most recent call last)
<ipython-input-97-f8487d9d0863> in <module>
----> 1 True / False

ZeroDivisionError: division by zero

Exercise 9

  • Suponiendo que x es de tipo int, escribe una expresión que devuelva True si el resto de dividir x entre 7 es par o False en caso contrario.

  • Escribe una expresión que evalúe si una variable x es booleana o un flotante.

Exercise 10

Dado a = 10, considera la siguiente expresión

>>> a <= 10 & 1 < a
False

¿Por qué no devuelve True? ¿Cómo podemos arreglarlo?


El tipo None#

Existe otro tipo que suele ser utilizado junto con booleanos, el NoneType. Este tipo tiene solo un objeto, None, que se suele utilizar para representar que un dato es vacío o desconocido.

type(None)
NoneType

Dado que NoneType contiene solo un tipo, lo que se suele hacer para comprobar si un objeto pertenece a esta clase es verificar si dicho objeto es None. Recordemos que el operador para ver si dos objetos son idénticos es is, mientras que usamos == para comparar valores o estados.

x = 22
x is None
False
x is not None
True

Por ahora es suficiente que sepamos que existe, ya veremos cómo utilizarlo cuando hablemos de flujos de control.