¡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:

image-3

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 consideran Falsy.
  • Los valores que evalúan a True se consideran Truthy.

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 sentencias if o while, 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):

Screenshot-2023-03-15-at-12.13.36-PM

💡 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 bien True o False. x es convertido usando el estándar truth testing procedure.
image-2

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á a False.
  • not datos será equivalente a not False, lo cual es True.
  • 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 a not True, lo cual es False.
  • 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 retorna False 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 y False.
  • 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.