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:
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
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)) # 122. Contador con Estado
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()) # 33. Decoradores Personalizados
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 vecesCasos de Uso Comunes
1. Configuración de Funciones
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)) # True2. Funciones con Parámetros Predefinidos
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)) # 15Conceptos Importantes
Closure (Clausura)
Las funciones internas recuerdan el entorno en el que fueron creadas:
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)) # 64Uso de nonlocal
Para modificar variables de la función exterior:
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)) # 18Ventajas
Flexibilidad: Permite crear funciones personalizadas dinámicamente
Encapsulación: Mantiene el estado privado
Reutilización: Código más modular y reutilizable
Legibilidad: Código más expresivo y fácil de entender
Comentarios
Publicar un comentario