PythonFunciones AvanzadasLección 10 de 24
Decoradores y Generadores
Los decoradores son funciones que envuelven a otras funciones para añadir comportamiento extra sin modificar el código original. Se aplican con @nombre_decorador justo antes de la función. Son el mecanismo detrás de @property, @staticmethod, @login_required en Django, y @app.route en Flask.
Los generadores son funciones que producen valores de uno en uno usando yield en lugar de return. A diferencia de una función normal que calcula todo y devuelve, un generador "pausa" su ejecución en cada yield y continúa cuando se pide el siguiente valor. Esto es fundamental para procesar datasets enormes sin cargar todo en RAM.
# Decorador básico
def cronometrar(funcion):
import time
def wrapper(*args, **kwargs):
inicio = time.time()
resultado = funcion(*args, **kwargs)
fin = time.time()
print(f"{funcion.__name__} tardó {fin-inicio:.4f}s")
return resultado
return wrapper
@cronometrar
def proceso_lento():
total = sum(range(1_000_000))
return total
resultado = proceso_lento() # Imprime el tiempo automáticamente
# Generadores (yield)
def fibonacci():
a, b = 0, 1
while True:
yield a # Produce un valor y pausa
a, b = b, a + b
fib = fibonacci()
for _ in range(10):
print(next(fib)) # 0, 1, 1, 2, 3, 5, 8, 13, 21, 34
# Generator expression
cuadrados = (x**2 for x in range(1000000)) # No crea toda la lista
print(next(cuadrados)) # 0
print(next(cuadrados)) # 1
Consejo⚡ Los generadores son eficientes en memoria. Mientras una lista [x**2 for x in range(1000000)] ocupa ~8MB, un generador ocupa bytes.
Practica esta lección
Resuelve los ejercicios del curso de Python en la app, gratis y con corrección automática.
Empezar a practicar