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 tipoint
, escribe una expresión que devuelvaTrue
si el resto de dividirx
entre 7 es par oFalse
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.