Skip to content

📙 Clase 08 — return a fondo

Fase 2 · Funciones y código organizado ⬅️ Volver al índice de clases

🎯 Qué aprendí

  • La diferencia real entre print (mostrar) y return (devolver un valor).
  • Devolver varios valores (tuplas) y el early return para validar.
  • El superpoder que desbloquea: separar la lógica de la interfaz.

📖 PARTE TEÓRICA

🎁 1. print muestra, return entrega

Hasta ahora tus funciones "hacen cosas" (ponen texto en pantalla). Con return, una función entrega un resultado que puedes guardar, combinar y reutilizar.

python
def saludar_print(nombre):
    print("Hola", nombre)        # solo MUESTRA; no entrega nada

def saludar_return(nombre):
    return f"Hola {nombre}"      # ENTREGA el texto a quien llamó

x = saludar_print("Ana")         # imprime "Hola Ana"…
print(x)                         # None   ← …pero no entregó nada
y = saludar_return("Ana")
print(y)                         # Hola Ana   ← el valor quedó en 'y'
printreturn
Qué hacemuestra en consolaentrega un valor al que llamó
¿Se puede reutilizar?no (se fue a la pantalla)sí: guardar, operar, pasar a otra función
Una función sin éldevuelve None automáticamente
python
def sumar(a, b):
    return a + b

resultado = sumar(2, 3)      # 5 — lo guardo
print(sumar(2, 3) * 10)      # 50 — lo uso en una operación

⚠️ Todo lo que esté después del return en esa rama no se ejecuta: return termina la función en ese instante.

🔀 2. Early return: validar y salir

Un patrón limpísimo: comprobar los casos malos primero y salir de inmediato. Evita ifs anidados.

python
def validar(nombre, email):
    if not nombre:
        return False, "El nombre está vacío"      # sale AQUÍ si falla
    if "@" not in email:
        return False, "El email no es válido"     # o AQUÍ
    return True, ""                               # si llegó hasta acá, todo bien

ok, msg = validar("", "x")       # ok=False, msg='El nombre está vacío'
ok, msg = validar("Ana", "ana@x.com")   # ok=True, msg=''

📦 3. Devolver varios valores

return a, b, c devuelve una tupla que desempaquetas al recibir (Clase 05).

python
def estadisticas(nums):
    return min(nums), max(nums), sum(nums) / len(nums)

menor, mayor, promedio = estadisticas([4, 8, 6])
print(menor, mayor, promedio)    # 4 8 6.0

🧪 Tip de entrevista: "¿Python puede devolver varios valores?" → Técnicamente devuelve una tupla, que se desempaqueta en varias variables. Es azúcar sintáctico del unpacking.


🖥️ EN TU APP DE ESCRITORIO

Este es el salto de calidad más grande que puedes dar ahora. Tus funciones actuales tocan la pantalla directamente; con return, la lógica vive aparte y la GUI solo la consume:

python
# ❌ ANTES: lógica y pantalla mezcladas (difícil de probar y reusar)
def registrar():
    if entry_nombre.get() == "":
        label_error.configure(text="Nombre vacío")
        return
    ...

# ✅ AHORA: la lógica es una función PURA que recibe datos y DEVUELVE un resultado
def validar(nombre, email):
    if not nombre:
        return False, "El nombre está vacío"
    if "@" not in email:
        return False, "El email no es válido"
    return True, ""

# …y el callback de la GUI solo la usa:
def registrar():
    ok, msg = validar(entry_nombre.get(), entry_email.get())
    if not ok:
        label_error.configure(text=msg)     # la GUI decide CÓMO mostrar
        return
    guardar_contacto()

Beneficios concretos:

Con return puedes…Ejemplo
Probar la lógica sin abrir la ventanavalidar("Ana", "mal") en la terminal
Reusar la misma lógica en otra pantallael mismo validar en alta y en edición
Cambiar la GUI sin tocar la lógicapasar de un Label a un popup sin tocar validar

💡 Regla del especialista en escritorio: la lógica recibe datos y devuelve resultados; solo los callbacks tocan widgets. Esta separación es la semilla de la arquitectura MVC de la Fase 6.


🗄️ CON BASE DE DATOS (caso de uso)

Las funciones de datos devuelven lo que la GUI necesita; nunca imprimen ni tocan pantalla:

python
def obtener_contactos(con):
    return con.execute("SELECT nombre, tel FROM contactos").fetchall()

def contar_pendientes(con):
    fila = con.execute("SELECT COUNT(*) FROM tareas WHERE hecha = 0").fetchone()
    return fila[0]           # la GUI decidirá dónde mostrar este número

🏋️ EJERCICIOS CON SOLUCIÓN

Ejercicio 1 — Área reutilizable

Escribe area_rectangulo(base, altura) que devuelva el área, y úsala para calcular la suma de las áreas de un rectángulo 2×3 y otro 4×5.

Ver solución
python
def area_rectangulo(base, altura):
    return base * altura

total = area_rectangulo(2, 3) + area_rectangulo(4, 5)
print(total)    # 26   (6 + 20) — posible porque DEVUELVEN, no imprimen

Ejercicio 2 — Early return

Escribe puede_votar(edad, pais) que devuelva (False, "menor de edad") si edad < 18, (False, "país no habilitado") si pais != "Perú", y (True, "") si todo pasa.

Ver solución
python
def puede_votar(edad, pais):
    if edad < 18:
        return False, "menor de edad"
    if pais != "Perú":
        return False, "país no habilitado"
    return True, ""

print(puede_votar(15, "Perú"))     # (False, 'menor de edad')
print(puede_votar(30, "Chile"))    # (False, 'país no habilitado')
print(puede_votar(30, "Perú"))     # (True, '')

Ejercicio 3 — Min y max juntos

Escribe extremos(lista) que devuelva el menor y el mayor a la vez, y recíbelos en dos variables.

Ver solución
python
def extremos(lista):
    return min(lista), max(lista)

menor, mayor = extremos([7, 2, 9, 4])
print(menor, mayor)    # 2 9

❓ Preguntas y respuestas (autoevaluación)

1. ¿Qué devuelve una función que no tiene return?

None, automáticamente.

2. ¿Qué pasa con el código escrito después de un return que se ejecuta?

No corre: return termina la función en ese punto.

3. ¿Cómo "devuelve varios valores" una función en Python?

Devuelve una tupla (return a, b) que se desempaqueta: x, y = f().

4. ¿Por qué return es clave en una app con GUI?

Permite separar la lógica (recibe datos, devuelve resultados) de la interfaz (solo muestra). Así la lógica se puede probar y reutilizar sin abrir ventanas.


📎 Apuntes relacionados

  • Tuplas y unpacking → Clase 05
  • Dónde encaja esto en grande → arquitectura de la Fase 6 en el índice

➡️ Siguiente

Clase 09 · Parámetros y argumentos — defaults, keyword args y los **kwargs con los que funciona CustomTkinter.