Inicio > Cursos > Python > Decoradores y Generadores
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.
← Itertools y Programación FuncionalType Hints y Anotaciones →

Practica esta lección

Resuelve los ejercicios del curso de Python en la app, gratis y con corrección automática.

Empezar a practicar