¡Hola! Si deseas aprender más sobre los valores truthy y falsy en Python y sobre cómo puedes usarlos, este artículo es para ti.
Aprenderás:
- Qué son los valores truthy y falsy.
- Cuándo un valor es truthy o falsy.
- Cómo usar la función
bool()
para determinar si un valor es truthy o falsy. - Cómo crear objetos truthy y falsy a partir de clases que has definido en tu programa con el método especial
__bool __()
.
¡Comencemos! ✨
🔹 Valores verdaderos (True) vs. valores truthy
Permíteme explicarte estos conceptos comparándolos con los valores True
y False
, los que normalmente usamos en nuestros programas.
En programación, las expresiones con operandos y operadores evalúan a True
o False
. Pueden ser usadas en la condición de una sentencia if
o de un ciclo while
para determinar si un bloque de código debe ejecutarse o no.
Aquí tenemos un ejemplo:
# Expresión: 5 < 3
if 5 < 3:
print("True")
else:
print("False")
# Resultado:
False
En este ejemplo, todo funciona como lo esperamos porque estamos usando una expresión con dos operandos y un operador 5 < 3
que evalúa a True
o False
.
¿Pero qué crees que ocurriría si intentamos ejecutar el siguiente código?
a = 5
if a:
print(a)
Nota que no tenemos una expresión típica en la condición de la sentencia if
, solo una variable:
Sorprendentemente, el resultado es:
5
En cambio, si cambiamos el valor de a
a cero, de esta forma:
a = 0
if a:
print(a)
Ahora no vemos ningún resultado.
Estoy segura de que en este momento te debes estar preguntado: ¿por qué el código se ejecutó correctamente?
La variable a
no es una expresión típica.
Si no tiene operandos y operadores, ¿por qué fue evaluada a True
o False
en base a su valor?
La respuesta yace en el concepto de los valores truthy y falsy, los cuales no son valores de verdad (Booleanos) en sí mismo, pero aún así evalúan a True
o False
en un contexto booleano.
🔸 Valores truthy and falsy
En Python, los valores individuales pueden evaluar a True
o False
. No necesariamente deben ser parte de una expresión más grande para que puedan evaluarse a un valor de verdad.
Ciertos valores ya tienen un valor de verdad que se asigna en base reglas predefinidas.
Las reglas básicas son:
- Los valores que evalúan a
False
se consideranFalsy
. - Los valores que evalúan a
True
se consideranTruthy
.
Según la documentación de Python:
Cualquier objeto puede ser evaluado como si fuera un valor verdadero o falso, para ser usado directamente en sentenciasif
owhile
, o como un operador en una operación booleana como las que veremos más adelante.
🔹 Contexto booleano
Ahora hablemos un poco sobre el concepto de un contexto booleano.
Cuando usamos un valor como parte de una expresión más grande o como una condición en una sentencia if
o en un ciclo while
, estamos usando un contexto booleano.
Puedes imaginarte el concepto de un contexto booleano como una "parte" específica de tu código que requiere que un valor sea verdadero o falso (True
o False
) para que la lógica del código tenga sentido.
Por ejemplo, la condición ubicada luego de la palabra clave if
o luego de la palabra clave while
debe evaluar a verdadero o falso (True
o False
):
💡 Dato: el valor se puede guardar en una variable. Podemos escribir el nombre de la variable luego de las palabras claves if
o while
en lugar del valor directamente, lo cual es equivalente.
Ahora que ya sabes qué son los valores truthy y falsy y cómo funcionan en un contexto booleano, veamos algunos ejemplos reales de valores truthy y falsy.
🔸 Valores falsy
Secuencias y colecciones:
- Listas vacías
[]
- Tuplas vacías
()
- Diccionarios vacíos
{}
- Conjuntos vacíos
set()
- Cadenas de caracteres vacías
""
- Rangos vacíos
range(0)
Números
- Cero en cualquier tipo de dato numérico.
- Entero
0
- Decimal
0.0
- Complejo
0j
Constantes
None
False
Los valores falsy fueron la razón por la cual no se mostró ningún resultado en nuestro ejemplo inicial cuando el valor de a
era cero.
El valor 0
es falsy, así que la condición de la sentencia if
es falsa (False
) y el código que corresponde al condicional no se ejecuta en este ejemplo:
a = 0
if a:
print(a)
# No hay resultado
🔹 Valores truthy
Según la documentación de Python:
Por defecto, un objeto se considera verdadero.
Los valores truthy incluyen:
- Secuencias y colecciones no vacías (listas, tuplas, cadenas de caracteres, diccionarios y conjuntos).
- Valores numéricos que no son cero.
True
El valor de a
se mostró en nuestro ejemplo inicial cuando su valor era 5 porque 5 es un valor truthy:
a = 5
if a:
print(a)
# Resultado
5
🔸 La función incorporada (built-in) bool()
Puedes comprobar si un valor es truthy o falsy con la función incorporada (built-in) bool()
.
Según la documentación de Python, esta función:
Retorna un booleano, es decir, o bienTrue
oFalse
. x es convertido usando el estándar truth testing procedure.
Solo debes pasar el valor como argumento, de esta forma:
>>> bool(5)
True
>>> bool(0)
False
>>> bool([])
False
>>> bool({5, 5})
True
>>> bool(-5)
True
>>> bool(0.0)
False
>>> bool(None)
False
>>> bool(1)
True
>>> bool(range(0))
False
>>> bool(set())
False
>>> bool({5, 6, 2, 5})
True
💡 Dato: También puedes pasar una variable como el argumento para comprobar si su valor es truthy o falsy.
🔹 Ejemplos reales
Una de las ventajas de usar valores truthy y falsy es que te pueden ayudar a escribir código más conciso y fácil de leer. Aquí tenemos dos ejemplos reales.
Ejemplo:
Tenemos la siguiente función print_even()
que toma una lista o tupla como argumento. Esta lista o tupla contiene números y solo muestra aquellos números que son pares. Si el argumento está vacío, muestra un mensaje.
def mostrar_pares(datos):
if len(datos) > 0:
for valor in datos:
if valor % 2 == 0:
print(valor)
else:
print("El argumento no puede estar vacío")
Nota esta línea:
if len(datos) > 0:
Podemos lograr que esta condición sea mucho más concisa si usamos valores truthy y falsy:
if datos:
Si la lista está vacía, datos
va a evaluar a False
. Si no está vacía, va a evaluar a True
, así que podemos obtener la misma funcionalidad con un código más conciso.
Esta sería nuestra función:
def mostrar_pares(datos):
if datos:
for valor in datos:
if valor % 2 == 0:
print(valor)
else:
print("El argumento no puede estar vacío")
Ejemplo:
También podemos usar valores truthy y falsy para generar una excepción (error) cuando el argumento no es válido.
def mostrar_pares(datos):
if not datos:
raise ValueError("El argumento no puede estar vacío")
for valor in datos:
if valor % 2 == 0:
print(valor)
En este caso, como usamos not datos
en la condición de la sentencia if
, obtenemos el valor opuesto de verdad para datos
en la condición.
Analicemos not datos
en más detalle:
Si datos
está vacío:
- Será un valor falsy, así que
datos
evaluará aFalse
. not datos
será equivalente anot False
, lo cual esTrue
.- La condición será
True
. - La excepción será generada.
If datos
no está vacío:
- Será un valor truthy, así que
datos
seráTrue
. not datos
será equivalente anot True
, lo cual esFalse
.- La condición será
False
. - La excepción no será generada.
🔸 Crear objetos truthy y falsy
Si conoces los conceptos de clases y programación orientada a objetos, puedes agregar un método especial a tus clases para que los objetos actúen como valores truthy y falsy.
__bool __()
Con el método especial __bool__()
, puedes definir una condición "personalizada" que determine cuándo un objeto de una clase evaluará a True
o False
.
Según la documentación de Python:
Por defecto, un objeto se considera verdadero a no ser que su clase defina o bien un método__bool__()
que retornaFalse
o un método__len__()
que retorna cero, cuando se invoque desde ese objeto.
Por ejemplo, si tenemos la siguiente clase:
class Cuenta:
def __init__(self, balance):
self.balance = balance
Puedes ver que no tiene ningún método especial definido. Por lo tanto, todos los objetos que crees a partir de esta clase siempre evaluarán a True
:
>>> cuenta1 = Cuenta(500)
>>> bool(cuenta1)
True
>>> cuenta2 = Cuenta(0)
>>> bool(cuenta2)
True
Podemos personalizar este comportamiento definiendo el método especial __bool__()
:
class Cuenta:
def __init__(self, balance):
self.balance = balance
def __bool__(self):
return self.balance > 0
Ahora, si el balance de la cuenta es mayor que cero, el objeto evaluará a True
. Si no (si el balance de la cuenta es cero) el objeto evaluará a False
.
>>> cuenta1 = Cuenta(500)
>>> bool(cuenta1)
True
>>> cuenta2 = Cuenta(0)
>>> bool(cuenta2)
False
💡 Dato: si __bool__()
no está definido en la clase pero el método __len__()
sí está definido, el valor retornado por este método determinará si el objeto es truthy o falsy.
🔹 En resumen
- Los valores truthy son valores que evalúan a
True
en un contexto booleano. - Los valores falsy son valores que evalúan a
False
en un contexto booleano. - Los valores falsy incluyen secuencias vacías (listas, tuplas, cadenas de caracteres, diccionarios y conjuntos), cero en cada tipo de dato numérico,
None
yFalse
. - Los valores truthy incluyen secuencias no vacías, números (excepto el
0
en cada tipo de dato numérico) y básicamente todo valor que no sea falsy. - Puedes usar valores truthy y falsy para escribir condiciones más concisas.
Muchas gracias por leer mi artículo. Espero que te haya gustado y que te sea de utilidad. Ahora ya sabes más sobre los valores truthy y falsy en Python.
🔅 Te invito a seguirme en Twitter (@EstefaniaCassN) y YouTube (Coding with Estefania) para encontrar tutoriales de programación.