¿Qué son las funciones de orden superior?
Son funciones que pueden recibir otras funciones como parámetros o devolver funciones como resultado.
Analogía: El Gerente de Restaurante
Imagina un gerente de restaurante:
Recibe instrucciones (funciones) de lo que debe hacer: "limpiar mesas", "cocinar pizza", "atender clientes"
Ejecuta esas instrucciones cuando es necesario
Puede delegar tareas a diferentes empleados según lo que necesite
El gerente es la función de orden superior - no hace el trabajo directamente, sino que organiza y usa a otros para hacerlo.
Característica 1: Recibir funciones como parámetros
Ejemplo 1: Aplicar operaciones matemáticas
# Funciones normales
def sumar(a, b):
return a + b
def multiplicar(a, b):
return a * b
# Función de orden superior
def operar(x, y, operacion):
return operacion(x, y)
# Usando la función de orden superior
resultado1 = operar(5, 3, sumar)
resultado2 = operar(5, 3, multiplicar)
print(f"5 + 3 = {resultado1}") # 8
print(f"5 * 3 = {resultado2}") # 15Ejemplo 2: Procesar lista de estudiantes
estudiantes = ["Ana", "Carlos", "Beatriz", "David"]
# Diferentes formas de procesar
def en_mayusculas(nombre):
return nombre.upper()
def en_minusculas(nombre):
return nombre.lower()
def con_saludo(nombre):
return f"¡Hola {nombre}!"
# Función de orden superior
def procesar_estudiantes(lista, procesador):
resultados = []
for estudiante in lista:
resultados.append(procesador(estudiante))
return resultados
# Usando diferentes procesadores
print(procesar_estudiantes(estudiantes, en_mayusculas))
# ['ANA', 'CARLOS', 'BEATRIZ', 'DAVID']
print(procesar_estudiantes(estudiantes, con_saludo))
# ['¡Hola Ana!', '¡Hola Carlos!', '¡Hola Beatriz!', '¡Hola David!']Característica 2: Devolver funciones como resultado
Ejemplo 3: Crear personalizadores de mensajes
# Función que DEVUELVE otra función
def crear_saludador(estilo):
if estilo == "formal":
def saludo_formal(nombre):
return f"Estimado/a {nombre}, es un placer saludarle."
return saludo_formal
elif estilo == "informal":
def saludo_informal(nombre):
return f"¡Hola {nombre}! ¿Cómo estás?"
return saludo_informal
else:
def saludo_neutro(nombre):
return f"Hola {nombre}"
return saludo_neutro
# Usando la función de orden superior
saludo_formal = crear_saludador("formal")
saludo_informal = crear_saludador("informal")
print(saludo_formal("María")) # "Estimado/a María, es un placer saludarle."
print(saludo_informal("Juan")) # "¡Hola Juan! ¿Cómo estás?"Ejemplo 4: Crear calculadoras específicas
def crear_calculadora(operacion):
if operacion == "suma":
return lambda a, b: a + b
elif operacion == "resta":
return lambda a, b: a - b
elif operacion == "multiplicacion":
return lambda a, b: a * b
else:
return lambda a, b: a / b
# Creando calculadoras específicas
sumador = crear_calculadora("suma")
restador = crear_calculadora("resta")
print(sumador(10, 5)) # 15
print(restador(10, 5)) # 5Ejemplos con funciones built-in de Python
Python ya tiene muchas funciones de orden superior:
Ejemplo 5: map() - Transformar elementos
numeros = [1, 2, 3, 4, 5]
def cuadrado(x):
return x ** 2
# map recibe una función y un iterable
resultados = list(map(cuadrado, numeros))
print(resultados) # [1, 4, 9, 16, 25]Ejemplo 6: filter() - Filtrar elementos
numeros = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
def es_par(n):
return n % 2 == 0
# filter recibe una función y un iterable
pares = list(filter(es_par, numeros))
print(pares) # [2, 4, 6, 8, 10]Ejemplo 7: sorted() - Ordenar con criterio personalizado
estudiantes = [("Ana", 15), ("Carlos", 12), ("Beatriz", 14)]
def por_edad(estudiante):
return estudiante[1] # Retorna la edad
# sorted recibe una función para la clave de ordenamiento
ordenados = sorted(estudiantes, key=por_edad)
print(ordenados) # [('Carlos', 12), ('Beatriz', 14), ('Ana', 15)]Ejemplo Práctico Completo: Sistema de Notificaciones
# Diferentes formas de enviar notificaciones
def enviar_email(mensaje):
return f"📧 Email enviado: {mensaje}"
def enviar_sms(mensaje):
return f"📱 SMS enviado: {mensaje}"
def enviar_push(mensaje):
return f"📱 Push enviado: {mensaje}"
# Función de orden superior
def sistema_notificaciones(usuarios, mensaje, metodo_envio):
resultados = []
for usuario in usuarios:
notificacion = f"Para {usuario}: {mensaje}"
resultado = metodo_envio(notificacion)
resultados.append(resultado)
return resultados
# Usando el sistema
usuarios = ["ana@email.com", "carlos@email.com", "beatriz@email.com"]
# Enviar por diferentes métodos
print("=== Enviando por Email ===")
emails = sistema_notificaciones(usuarios, "Tu pedido ha sido enviado", enviar_email)
for email in emails:
print(email)
print("\n=== Enviando por SMS ===")
sms = sistema_notificaciones(usuarios, "Tu pedido ha sido enviado", enviar_sms)
for mensaje in sms:
print(mensaje)Combinando con Lambdas
# Usando lambdas directamente con funciones de orden superior
numeros = [1, 2, 3, 4, 5]
# Con lambda, sin necesidad de definir funciones aparte
cuadrados = list(map(lambda x: x ** 2, numeros))
pares = list(filter(lambda x: x % 2 == 0, numeros))
print(cuadrados) # [1, 4, 9, 16, 25]
print(pares) # [2, 4]Resumen
Función de orden superior: Recibe funciones como parámetros o devuelve funciones
Ventajas: Código más flexible, reutilizable y expresivo
Casos comunes:
map(),filter(),sorted(), callbacksSe combinan muy bien con funciones lambda
Regla mnemotécnica:
"Las funciones de orden superior son como jefes inteligentes: no hacen el trabajo pesado, sino que delegan en otros"
¿Qué tal? ¿Te gustaría que profundice en algún ejemplo específico o ver más casos de uso?
Comentarios
Publicar un comentario