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 retornarFalse
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
yor
evalúan una expresión de izquierda a derecha.- La operación
and
, si todos los valores sonTrue
, retorna el último en ser evaluado. Si algún valor es falso, retorna el primero. or
retorna el primer valor que seaTrue
. Si todos sonFalse
, 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 comoTrue
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
is
se evalúa comoTrue
si las referencias en ambos lados del operador apuntan al mismo objeto;False
en caso contrario. (Véase Diferencia entre variables en Python y otros lenguajes).is not
es la negación de lo anterior.
>>> 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
Curso online 👨💻
¡Ya lanzamos el curso oficial de Recursos Python en Udemy!
Un curso moderno para aprender Python desde cero con programación orientada a objetos, SQL y tkinter
en 2024.
Consultoría 💡
Ofrecemos servicios profesionales de desarrollo y capacitación en Python a personas y empresas. Consultanos por tu proyecto.