Funciones que Retornan Funciones en Python

 En Python, las funciones pueden retornar otras funciones, lo que es una característica poderosa de la programación funcional. Esto permite crear funciones "fábrica" que generan funciones personalizadas.

Concepto Básico

Una función que retorna otra función se comporta como una "fábrica" de funciones:

python
def crear_saludador(saludo):
    def saludar(nombre):
        return f"{saludo}, {nombre}!"
    return saludar

# Uso
saludar_es = crear_saludador("Hola")
saludar_en = crear_saludador("Hello")

print(saludar_es("Juan"))    # Hola, Juan!
print(saludar_en("John"))    # Hello, John!

Ejemplos Prácticos

1. Calculadora de Operaciones

python
def crear_operacion(operador):
    def operar(a, b):
        if operador == "+":
            return a + b
        elif operador == "-":
            return a - b
        elif operador == "*":
            return a * b
        elif operador == "/":
            return a / b if b != 0 else "Error: división por cero"
    return operar

# Crear operaciones específicas
sumar = crear_operacion("+")
restar = crear_operacion("-")
multiplicar = crear_operacion("*")

print(sumar(5, 3))        # 8
print(restar(10, 4))      # 6
print(multiplicar(2, 6))  # 12

2. Contador con Estado

python
def crear_contador():
    contador = 0
    def contar():
        nonlocal contador
        contador += 1
        return contador
    return contar

# Crear contadores independientes
contador1 = crear_contador()
contador2 = crear_contador()

print(contador1())  # 1
print(contador1())  # 2
print(contador2())  # 1
print(contador1())  # 3

3. Decoradores Personalizados

python
def repetir(n_veces):
    def decorador(func):
        def wrapper(*args, **kwargs):
            for _ in range(n_veces):
                resultado = func(*args, **kwargs)
            return resultado
        return wrapper
    return decorador

@repetir(3)
def saludar():
    print("¡Hola!")

saludar()  # Imprime "¡Hola!" 3 veces

Casos de Uso Comunes

1. Configuración de Funciones

python
def crear_validador(minimo, maximo):
    def validar(valor):
        return minimo <= valor <= maximo
    return validar

# Crear validadores específicos
validar_edad = crear_validador(0, 120)
validar_porcentaje = crear_validador(0, 100)

print(validar_edad(25))        # True
print(validar_edad(150))       # False
print(validar_porcentaje(75))  # True

2. Funciones con Parámetros Predefinidos

python
def crear_multiplicador(factor):
    def multiplicar(numero):
        return numero * factor
    return multiplicar

doblar = crear_multiplicador(2)
triplicar = crear_multiplicador(3)

print(doblar(5))    # 10
print(triplicar(5)) # 15

Conceptos Importantes

Closure (Clausura)

Las funciones internas recuerdan el entorno en el que fueron creadas:

python
def crear_exponente(exponente):
    def elevar(base):
        return base ** exponente
    return elevar

cuadrado = crear_exponente(2)
cubo = crear_exponente(3)

print(cuadrado(4))  # 16
print(cubo(4))      # 64

Uso de nonlocal

Para modificar variables de la función exterior:

python
def crear_acumulador():
    total = 0
    def acumular(valor):
        nonlocal total
        total += valor
        return total
    return acumular

acumulador = crear_acumulador()
print(acumulador(10))  # 10
print(acumulador(5))   # 15
print(acumulador(3))   # 18

Ventajas

  1. Flexibilidad: Permite crear funciones personalizadas dinámicamente

  2. Encapsulación: Mantiene el estado privado

  3. Reutilización: Código más modular y reutilizable

  4. Legibilidad: Código más expresivo y fácil de entender

Comentarios

Entradas populares de este blog

¿Qué es un Closure?

4 tipos de colecciones de datos más

Calculadora de edad