Apariencia
📙 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) yreturn(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'print | return | |
|---|---|---|
| Qué hace | muestra en consola | entrega 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 él | — | devuelve 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
returnen esa rama no se ejecuta:returntermina 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 ventana | validar("Ana", "mal") en la terminal |
| Reusar la misma lógica en otra pantalla | el mismo validar en alta y en edición |
| Cambiar la GUI sin tocar la lógica | pasar 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 imprimenEjercicio 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:
returntermina 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
➡️ Siguiente
Clase 09 · Parámetros y argumentos — defaults, keyword args y los **kwargs con los que funciona CustomTkinter.