¿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

python
# 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}")  # 15

Ejemplo 2: Procesar lista de estudiantes

python
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

python
# 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

python
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))  # 5

Ejemplos con funciones built-in de Python

Python ya tiene muchas funciones de orden superior:

Ejemplo 5: map() - Transformar elementos

python
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

python
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

python
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

python
# 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

python
# 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 comunesmap()filter()sorted(), callbacks

  • Se 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

Entradas populares de este blog

¿Qué es un Closure?

Calculadora de edad

Funciones en Python: con y sin paréntesis