No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Higher order function: una función dentro de otra función

18/44
Recursos

Aportes 95

Preguntas 15

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

Normalmente solemos usar parámetros y argumentos como sinónimos, y en la práctica podemos inferir lo que esto significa según el contexto. Pero en un entorno profesional, deberíamos tener muy claro que los parámetro son las reglas o instrucciones que definimos dentro de la función, mientras los argumentos son los datos que le pasamos a la función para que los “reemplace” y ejecute la función.

Algo así como en matemáticas básicas, cuando definimos y = x^2 + x + 3, la derecha de la ecuación serían los parámetros, mientras que los argumentos, serían los valores que le asignamos a la x, bien sea para encontrar las coordenadas de un punto (una iteración), o para trazar la gráfica completa (multiples iteraciones)…

**Parámetros: **Reglas Internas de la Función.

**Argumentos: **Datos Externos que le Pasamos a la Función para que Pueda Hacer sus Cálculos.

^_^

Amigos les comparto mi experiencia hasta ahora:
Cuando comenzaron las explicaciones sobre funciones realmente batallé bastante, comencé a pensar que tal vez esto no es lo mio, que es muy complicado, y decidí por mera curiosidad regresar a ver desde el inicio el curso de fundamentos de Python para toparme con que entendí la mayoría de las cosas a la perfección y ya sabía muchas cosas que la primera vez no me quedaron claras, hoy se cosas que hace un mes no sabía y la mejor forma de conocer tu avance es comparandose con uno mismo, a veces los aportes pueden intimidar un poco porque uno asume que los demás compañeros entendieron todo a la primera y uno no, ustedes no se desanimen, sigan con el curso y vuelvanlo a ver en un par de meses para que vean su avance, hasta aqui mi reporte joaquin :v

Higher order function: una función dentro de otra función
Una función de Orden Superior o en sus siglas HOF se le lama así solo cuando contiene otras funciones como parámetro de entrada o devuelve una función como salida, es decir que en este caso las funciones que operan a otras funciones se les denomina Higher order function.

También hay que entender que a estas Funciones de Orden Superior HOF se aplican para funciones y métodos que toman como funciones a los parámetros o devuelven una función como un resultado.

Propiedades de HOF

  • Una función es una instancia de tipo objeto.
  • Puede almacenar una función en una variable.
  • Puede pasar una función como un parámetro a otra función.
  • Puede devolver la función desde una función.
  • Se puede almacenar en una estructura de datos como tablas, listas, etc.
def increment(x):
  return x + 10

increment_v2 = lambda x: x + 10

def hof(x, func):
  return x + func(x)

hof_v2 = lambda x, func: x + func(x) + func(x)

result = hof(20, increment)
# 20 + (20 + 10)
print(result)

En este caso Observamos como utilizando la función lambda podemos continuar seguir la función.

_Produccion_
50

Ahora HOF podemos incluir en este caso un signo de operación matemático de suma y multiplicación.

def increment(x):
  return x + 10

increment_v2 = lambda x: x + 10

def hof(x, func):
  return x + func(x)

hof_v2 = lambda x, func: x + func(x) + func(x)

result = hof(20, increment)
# 20 + (20 + 10)
print(result)

result = hof_v2(20, increment_v2)
print(result)

result = hof_v2(20, lambda x: x + 2)
result = hof_v2(20, lambda x: x * 2)
_Producción:_
50
80

Material de apoyo

Interesante pero, con cuidadito no… que despúes hacemos código poco legible y eso no esta bueno para un equipo de trabajo.
Es importante conocer las herramientas, pero no usarlas todas al mismo tiempo sin justificación.
El profe muy bien explica “todo lo que es posible”, pero ya la experiencia nos dará el criterio para elegir que usar y que no.
Recordemos que posiblemente tu código necesite mantenimiento y es importante que al volver entendamos como estan atados los hilos.
Acá es muy fácil pasarse la mano y romper varios principios del zen de python.

No sabía que Python podía recibir funciones en los parámetros de otras funciones, parecido a lo que se hace con los “callbacks” en JavaScript.

La versión más super resumida que logré

(lambda x, func: x + func(x))(2, lambda x: x + 1)

Mis notas de la clase:

def increment(x):
  return x +1 

def high_ord_func(x, func):
  return x + func(x)


result = high_ord_func(2, increment)
print(result)

# Utilizando lambda en ambas funciones
increment_v2 = lambda x: x+1
high_ord_func_v2 = lambda x, func: x + func(x)

result = high_ord_func_v2(2, increment_v2)
print(result)

#Lambda directo en la funcion
result = high_ord_func_v2(2, lambda x: x+2)
print(result)

Echo en falta el uso de elementos de aprendizaje más conceptuales y teóricos como diagramas de flujo, dibujos y uso de metáforas explicativas que hagan más ameno y visual la explicación. ¿Para qué quiero tanto código si no entiendo el concepto en sí o el caso de uso de dicha función?

Este profe solo fue bueno para el primer curso, en este explica muy mal

Yo hice una calculadora con lambdas:

def calculadora(a, b, func):
  return func(a, b)
  
suma = lambda a, b: a + b
resta = lambda a, b: a - b
multiplicacion = lambda a, b: a * b
division = lambda a, b: a / b
potenciacion = lambda a, b: a ** b

operacion = calculadora(3, 2, potenciacion)
print(operacion)

que les parece

Es un poco complicado al inicio pero con el tiempo lo comprenderemos mejor, lo bueno es saber que esto existe para que un futuro podamos leerlo y si tenemos dudas podemos profundizar en el tema si asi lo requerimos.

aprendiendo mucho en poco tiempo , genial

Un resumen…

  • Entonces una “high order function” es una función que puede tomar una o más funciones como argumentos y/o devolver una función como resultado.
  • Esto significa que las “high order functions” permiten que otras funciones se comporten como datos y se manipulen de manera flexible y dinámica dentro del programa.
    - En resumen, son funciones que trabajan con otras funciones.

por que hacerlo sobre el mismo ejemplo? no puede crear uno nuevo y que se vea mas limpio?

nooo no entiendoooo

Les traigo un pequeño programita que hice.

"""
Tema: High Order
Filtrar números pares: Escribe una función que tome una lista de números como entrada y use una Higher Order Function para filtrar y devolver una nueva lista que contenga solo los números pares.
"""

def es_par(numero):
    return numero % 2 == 0

def filter_pares(funcion_validacion, lista):
    return [numero for numero in lista if funcion_validacion(numero)]

numeros = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

numeros_pares = filter_pares(es_par, numeros)
print("Números pares:", numeros_pares)

Esta es otra explicación aparte de la que hizo Stephen Hawking en Los Padrinos Magicos de porque 2 + 2 es 5

Otra maravilla las lambda funcions:

def increment(x):
  return x + 1

increment_v2 = lambda x : x + 1

def hof(x, func):
  return x + func(x)

hof_v2 = lambda x, func : x + func(x)

result = hof(2, increment)

print(result)

re_result = hof(2,increment_v2)

print(re_result)

re_result_v2 = hof(2,lambda x : x + 1)
re_result_v3 = hof(2,lambda x : x * 5)
re_result_v4 = hof(2,lambda x : x * 7)
print(re_result_v2)
print(re_result_v3)
print(re_result_v4)

Me recuerda a las funciones de callback de JS. Se me ocurre para casos de uso donde debamos tener un cierto dinamismo en base a un contexto determinado, donde primero hacemos algo con el primer parametro y luego ejecutamos la funcion recibida que puede variar segun el contexto de la aplicacion y evitamos sobrecargar de logica a esta funcion, simplemente esta ejecutara lo que debe hacer con el primer parametro y luego procedera a ejecutar la recibida en el segundo parametro, casi como una cola de tareas tambien podria verse o incluso un arbol de tareas.

#HOF are functions that either:
#accept a function as an argument or
# returns a function
#this is allowed in python because functions are also treated as OBJECTS

me gusta mas trabajar con las funciones clasicas esas lambdas yo no las he visto mucho

Porque func y no increment?

En este caso, func es un nombre de parámetro que se utiliza para generalizar la función de orden superior high_ord_func. Esto significa que high_ord_func no está diseñada específicamente para trabajar solo con la función increment, sino que puede aceptar cualquier función que cumpla con el formato requerido.

Al usar el nombre más general func en lugar de increment, se hace que la función high_ord_func sea más genérica y reutilizable. Puedes pasar cualquier función que tome un argumento y devuelva un resultado que se pueda sumar al valor x. Si decides cambiar la función que pasas como argumento, no necesitas cambiar el nombre de la función en el código de high_ord_func.

Por ejemplo, podrías tener otra función llamada double que duplica un número:

pythonCopy code
def double(x):
    return x * 2

result = high_ord_func(2, double)
# Esto dará como resultado 2 + double(2) = 2 + (2 * 2) = 6
print(result)

En este caso, double se pasa como argumento a high_ord_func a través del parámetro func. Esto ilustra la flexibilidad y generalidad que se logra al usar un nombre de parámetro genérico como func en lugar de algo específico como increment.

En el ejemplo, el HOF recibe dos parámetros, uno de ellos es una función que se ejecuta dentro del HOF. Se supone que es obvio. Ahora, veo que hay un error en el código del profe, repite 'result' dos veces, así que no se está comprobando que el resultado es el msimo.
"""
Validación de datos: Crea una función que tome una lista de datos y una función de validación como entrada. La función de validación debe tomar un dato individual y retornar True si cumple ciertas condiciones o False si no. La función principal debe usar la Higher Order Function para filtrar los datos válidos y devolver una nueva lista con los datos que cumplan con la condición de validación.
"""

def datos(dato):
  return dato

def validar(dato, funcion):
  if dato>=2:
    return True
  else:
    return False

resultado = validar(2, datos)
print("Resultado:", resultado)

Cuando enviamos una funcion como parametro, realmente lo
que estamos haciendo es mandar el dato de la ubicacion en memoria de esa funcion para que python o la funcion de alto nivel acceda a la funcion menor por su identificador en memoria, este identificador se puede ver usando el metodo id

def my_func():
	pass

#objeto en memoria que apunta a la funcion
print(my_func)
--> <function any_func at 0x000001BC2605C5E0>
id(my_func)
--> 1907603391968

Muy bien. Vengo disfrutando la clase, y aprendiendo un montón.

HOF

#-----High order function-------

#funcion dentro de otra funcion
def increment(x):
  return x + 1

def high_order_func(x, func):
  return x + func(x)

result = high_order_func(2, increment)
print(result)
--> 5

# HOF con lambda
increment2 = lambda x: x + 1
high_order_func2 = lambda x, func: x + func(x)
result2 = high_order_func2(2, increment2)
print(result2)
--> 5

# enviar directamente lambda a la HOF
result3 = high_order_func2(2, lambda x: x*4)
print(result3)
--> 10

#A una función se le puede enviar otra función y ejecutarla desde ahí.

def increment(x):
return x +1

def high_ord_func(x, func):
return x + func(x) #Aquí se ejecuta la función

result = high_ord_func(2, increment)

2 + (2 + 1)

print(result)

#Lambda
increment_v2 = lambda x : x + 1
high_ord_func_v2 = lambda x, func: x + func(x)

result = high_ord_func_v2(2, increment_v2)
result = high_ord_func_v2(2, lambda x : x + 2 )
print(result)
result = high_ord_func_v2(2, lambda x : x * 5 )
print(result)

lambda -parámetros de entrada- : función

# Función increment
def increment(x):
    return x + 1

# Función increment usando lambda
increment_v2 = lambda x: x + 1

# Función de orden superior que toma una función como argumento
def high_ord_func(x, func):
    return x + func(x)

# Función de orden superior usando lambda
high_ord_func_v2 = lambda x, func: x + func(x)

# Resultados usando las funciones definidas
result = high_ord_func(2, increment)
print(result)  # 5 (2 + (2 + 1))

result = high_ord_func_v2(2, increment_v2)
print(result)  # Output: 5 (2 + (2 + 1))

result = high_ord_func_v2(2, lambda x: x + 2)
print(result)  # Output: 6 (2 + (2 + 2))

result = high_ord_func_v2(2, lambda x: x * 5)
print(result)  # Output: 12 (2 + (2 * 5))
Definitivamente el maestro debería hacer un ejemplo separado para cada explicación
No es bueno que explique sobre ejemplos anteriores, es mas confuzo! Es un enredo!
¿Qué es higth order function en python ? Las funciones de orden superior en Python, también conocidas como "High Order Functions", son aquellas funciones que pueden tomar una o más funciones como argumentos, y/o retornar, al momento de ser llamadas estás misma se encarga de realizar la llamada de la función que se envía como argumento junto a los parámatros y dar un resultado. Este tipo de funciones son un concepto fundamental en la programación funcional, repositorio <https://github.com/angel20125/python-2-comprehension-functions-2024> ![](https://static.platzi.com/media/user_upload/clase-18-HOF-248ff5a7-6135-4e56-b2d1-08fcfd90bc25.jpg)
¿Qué es higth order function en python ? Las funciones de orden superior en Python, también conocidas como "High Order Functions", son aquellas funciones que pueden tomar una o más funciones como argumentos, y/o retornar, al momento de ser llamadas estás misma se encarga de realizar la llamada de la función que se envía como argumento junto a los parámatros y dar un resultado. Este tipo de funciones son un concepto fundamental en la programación funcional, ![](https://static.platzi.com/media/user_upload/clase-18-HOF-30af2e74-3142-44a3-9b89-dfcdc07df344.jpg)
Que placer poder llegar hasta aquí y continuar aprendiendo. Saludos compañeros 🙌🏽
**Trabajar con funciones Higher order function:** 1. **Funciones como argumentos:** Cuando pasas una función como argumento a una  higher order function, asegúrate de que estás pasando la función en sí y no el resultado de la función. Por ejemplo, si tienes una función llamada square, deberías pasarla como square, no como square(). 2. **Funciones lambda pasadas como argumento:** Las funciones lambda son útiles cuando quieres pasar una función simple como argumento a una función de orden superior. Sin embargo, pueden ser difíciles de leer si son demasiado complejas. Si la función que quieres pasar es compleja, puede ser mejor definirla normalmente y luego pasarla como argumento. 3. **Pruebas:** Al igual que con cualquier otro código, es importante probar tus higher order function para asegurarte de que funcionan como esperas. Puedes hacer esto creando algunas funciones de prueba y pasándolas a tu función de orden superior. **Legibilidad:** Asegúrate de que tu código sea fácil de leer. Esto es especialmente importante cuando trabajas con higher order function y funciones lambda, ya que pueden ser difíciles de entender para alguien que no está familiarizado con ellas. Usa nombres de variables descriptivos y añade comentarios a tu código cuando sea necesario.
```python def increment(x): return x + 1 increment_v2 = lambda x: x +1 def high_ord_func(x, func): return x + func(x) high_ord_func_v2 = lambda x, func: x + func(x) result = high_ord_func(2, increment) # 2 + (2 + 1) print(result) result = high_ord_func_v2(2, increment_v2) print(result) result = high_ord_func_v2(2, lambda x: x +2) print(result) result = high_ord_func_v2(2, lambda x: x * 2) print(result) ```def increment(x): return x + 1 increment\_v2 = lambda x: x +1 def high\_ord\_func(x, func): return x + func(x) high\_ord\_func\_v2 = lambda x, func: x + func(x) result = high\_ord\_func(2, increment) \# 2 + (2 + 1) print(result) result = high\_ord\_func\_v2(2, increment\_v2) print(result) result = high\_ord\_func\_v2(2, lambda x: x +2) print(result) result = high\_ord\_func\_v2(2, lambda x: x \* 2) print(result)
me gusta mas trabajar con las funciones clasicas esas lambdas uno no las ve mucho, o no las veo mucho
Pues, he intentado hacer una calculadora con este concepto, siento que es algo complicado, pero bueno aquí lo que he hecho: ```python def calculadora(operacion): """ Función de orden superior que toma una operación como argumento y devuelve una función que realiza esa operación entre dos números. Args: operacion (str): La operación que se desea realizar (+, -, *, /). Returns: function: Una función que toma dos argumentos (num_1, num_2) y realiza la operación correspondiente entre ellos. """ def basica_operacion(num_1, num_2): """ Función interna que realiza la operación matemática entre dos números. Args: num_1 (int): El primer número. num_2 (int): El segundo número. Returns: int o str: El resultado de la operación. Si se intenta dividir por cero, devuelve un mensaje de error en mayúsculas. """ operaciones = { '+': lambda: num_1 + num_2, '-': lambda: num_1 - num_2, '*': lambda: num_1 * num_2, '/': lambda: num_1 / num_2 if num_2 > 0 else 'NO SE PUEDE DIVIDIR ENTRE 0' } return operaciones[operacion]() return basica_operacion def usuario_numeros(): """ Función que solicita al usuario que ingrese dos números enteros. Maneja las excepciones en caso de que el usuario ingrese un valor inválido. Returns: tuple: Una tupla con los dos números ingresados por el usuario. """ for i in range(5): try: num_1 = int(input('Ingrese el primer número =>: ')) num_2 = int(input('Ingrese el segundo número =>: ')) return num_1, num_2 except ValueError: print('El valor ingresado es inválido') else: print('Ha sobrepasado el número de intentos') exit() def operacion_usuario(): """ Función que solicita al usuario que ingrese la operación que desea realizar. Verifica que la entrada sea una de las operaciones válidas (+, -, *, /). Returns: str: La operación ingresada por el usuario. """ opciones = ('+', '-', '*', '/') for i in range(5): usuario_operacion = input('Digite la operación que desea realizar (+, -, *, /) =>: ') if usuario_operacion in opciones: return usuario_operacion else: print('Valor ingresado inválido') else: print('Ha sobrepasado el número de intentos') exit() # Sección principal del código num_1, num_2 = usuario_numeros() operacion = operacion_usuario() operacion_lista = calculadora(operacion) numeros_listos = operacion_lista(num_1, num_2) print(f'El resultado de {num_1} {operacion} {num_2} es: {numeros_listos}') ```
Usen Tutor de Python para poder ver como se ejecuta el código línea por línea, se entiende muy bien y deja claro las cosas. Link: <https://pythontutor.com/render.html#mode=display>
Les dejo la explicación de GPT acerca de la clase, personalmente me ayudo bastante a comprender el tema de las HOF. Claro, estaré encantado de explicarte sobre las funciones de orden superior o *High Order Functions* (HOF) en Python y cómo funcionan, usando el ejemplo que proporcionaste. ### ¿Qué son las High Order Functions (HOF)? Una **función de orden superior** es una función que cumple al menos uno de los siguientes criterios: * Puede aceptar una o más funciones como argumentos. * Retorna una función como resultado. Esto significa que las HOF tratan a las funciones como ciudadanos de primera clase, permitiendo que las funciones se pasen y se usen como cualquier otro valor, como un número o una cadena. ### Ejemplo Desglosado El ejemplo que proporcionaste ilustra perfectamente ambos criterios de una HOF: ```js def increment(x): return x + 1 def high_ord_func(x, func): return x + func(x) result = high_ord_func(2, increment) print(result) ```def increment(x): return x + 1 def high\_ord\_func(x, func): return x + func(x) result = high\_ord\_func(2, increment) print(result) * `increment` es una función simple que toma un valor `x` y devuelve `x + 1`. * `high_ord_func` es una HOF porque toma una función como uno de sus argumentos (`func`). Dentro de `high_ord_func`, llama a `func` pasándole el valor de `x` y luego suma el resultado al propio `x`. Al llamar a `high_ord_func(2, increment)`, estás haciendo lo siguiente: 1. Pasas el número `2` y la función `increment` a `high_ord_func`. 2. Dentro de `high_ord_func`, `func(x)` se evalúa como `increment(2)`, lo que da `3`. 3. Luego, suma este resultado (`3`) al valor original de `x` (`2`), resultando en `5`. ### Uso y Aplicaciones Las HOF son extremadamente útiles en varios contextos, especialmente en programación funcional, donde las funciones son utilizadas intensivamente. Algunas de sus aplicaciones incluyen: * **Abstracción y Reutilización de Código**: Permiten escribir código más genérico y reutilizable. En lugar de escribir múltiples funciones que hacen tareas similares, puedes escribir funciones de orden superior que acepten las diferencias como argumentos de función. * **Operaciones con Listas y Datos**: Python tiene varias HOF incorporadas que son ampliamente utilizadas para trabajar con listas y otros tipos de colecciones, como `map()`, `filter()`, y `reduce()`. Estas funciones permiten aplicar operaciones a cada elemento de una lista de manera eficiente y concisa. * **Callbacks y Manejadores de Eventos**: En programación de GUI o desarrollo web, las HOF se usan para definir callbacks o manejadores de eventos, donde pasas una función que se llama cuando ocurre un evento específico. * **Decoradores**: Son un uso avanzado de HOF donde una función (decorador) toma una función como argumento y retorna otra función, permitiendo modificar o extender el comportamiento de la función original sin alterar su código directamente. Las HOF son una herramienta poderosa que, una vez comprendida, puede abrirte a un nuevo mundo de posibilidades en la programación, permitiéndote escribir código más limpio, más modular y a menudo más eficiente. Entiendo tu confusión, y es común cuando se está empezando a aprender sobre conceptos como las funciones de orden superior. Vamos a desglosarlo más para clarificar cómo funciona exactamente `high_ord_func` y lo que sucede cuando se llama a `func(x)`. ### ¿Qué hace `func(x)`? Cuando pasas una función como argumento a otra función (en este caso, pasas `increment` a `high_ord_func`), lo que estás haciendo es pasar la definición de esa función, no el resultado de ejecutarla. Esto significa que dentro de `high_ord_func`, `func` es esencialmente un alias para la función `increment`, y `func(x)` es lo mismo que llamar a `increment(x)`. Por lo tanto, cuando se ejecuta `func(x)` dentro de `high_ord_func`, lo que está sucediendo es lo siguiente: * Se llama a la función `increment`, pasando `x` como argumento. * `increment` toma ese `x`, le suma 1, y devuelve el resultado. * Ese resultado se utiliza en el contexto de la expresión en la que se llamó `func(x)`, que en este caso es `x + func(x)`. ### Ejemplo con `high_ord_func(2, increment)` Cuando llamas a `high_ord_func(2, increment)`, el flujo es el siguiente: 1. `x` es `2` y `func` es `increment`. 2. Dentro de `high_ord_func`, se evalúa `func(x)`, que es equivalente a `increment(2)`. * La función `increment` devuelve `2 + 1 = 3`. 3. Entonces, la expresión `x + func(x)` se convierte en `2 + 3`, que es igual a `5`. 4. `high_ord_func` retorna `5`. ### Puntos clave * `func(x)` **es una llamada a la función que se pasa como argumento a** `high_ord_func`**.** No es una variable ni un valor guardado; es una operación que se ejecuta cada vez que `high_ord_func` es llamada con una función específica como su segundo argumento. * `func` **puede ser cualquier función que tome un solo argumento y devuelva un valor,** no tiene que ser específicamente `increment`. Esto es lo que hace que `high_ord_func` sea flexible y reutilizable. * **No estás llamando a una función *dentro* de** `high_ord_func` **en el sentido de que** `high_ord_func` **contenga directamente esa función.** En lugar de eso, estás pasando la función `increment` *a* `high_ord_func`, que luego la utiliza dentro de su propia lógica. Este enfoque permite que `high_ord_func` sea increíblemente versátil, ya que su comportamiento puede cambiar basado en la función que se le pase, permitiendo una gran reutilización y abstracción de código. YouVale, entiendo que func en este ejemplo es un alias de increment, pero como es que python sabe que estoy llamando a increment ¿Es porque esta antes de la funcion high\_ord\_func? Me surge la duda bien puedo ponerle cualquier alias a la funcion que fungira como parametro y no saber a que funcion esta llamandoChatGPTChatGPT Entiendo tu confusión, y es una parte fundamental de entender cómo funcionan las funciones de orden superior en Python. Vamos a aclarar cómo Python sabe a qué función te estás refiriendo y cómo funciona el concepto de pasar funciones como argumentos. ### Cómo Python Sabe a Qué Función te Refieres Python sabe a qué función te refieres porque le pasas la función misma como un argumento. No importa el nombre del parámetro (`func` en este caso) dentro de `high_ord_func`; lo que importa es el objeto de función específico que pasas al llamar a `high_ord_func`. Aquí, pasas la función `increment` directamente, no una cadena con su nombre o alguna otra referencia indirecta. El alias `func` dentro de `high_ord_func` solo existe en el ámbito de esa función. Es simplemente el nombre que se usa dentro de `high_ord_func` para referirse a "cualquier función que me pasen aquí". Podrías renombrar `func` a cualquier otro nombre válido de variable, y todo funcionaría igual, siempre que uses el mismo nombre dentro del cuerpo de `high_ord_func` para llamar a la función. ### Ejemplo Ilustrativo `def increment(x):` ` return x + 1` `def decrement(x):` ` return x - 1` `def high_ord_func(x, any_func_name_here):` ` return x + any_func_name_here(x)` `result_increment = high_ord_func(2, increment)` `result_decrement = high_ord_func(2, decrement)` `print(result_increment) # Esto imprimirá 5, porque increment() suma 1 a x.` `print(result_decrement) # Esto imprimirá 3, porque decrement() resta 1 a x.` En este ejemplo, `high_ord_func` se llama dos veces con diferentes funciones como segundo argumento. La primera vez se pasa `increment`, y la segunda vez `decrement`. Dentro de `high_ord_func`, el parámetro `any_func_name_here` toma el lugar de `func`, demostrando que el nombre del parámetro es arbitrario. Lo que importa es el objeto de función que se pasa al llamar a `high_ord_func`. ### Puntos Clave * **La función específica que** `high_ord_func` **ejecuta depende totalmente del argumento que recibe al ser llamada.** No tiene que estar definida antes o después de `high_ord_func` en el código. * **Puedes pasar cualquier función que cumpla con la firma esperada (en este caso, que tome un solo argumento y devuelva un valor) como el segundo argumento de** `high_ord_func`**.** * **El nombre del parámetro que se utiliza dentro de** `high_ord_func` **para representar la función pasada es completamente arbitrario y local a la función** `high_ord_func`**.** Espero que esto aclare cómo las funciones de orden superior trabajan con funciones como argumentos en Python.
Me gusta como explica el profe a mi en mi opinión, la verdad gracias a que le e puesto atención y haciendo lo mismo en mi compu e comprendido muy bien el tema. Ojala que a los que no lo entiendan logren entenderlo.
En resumen: HOF es como anidar otras Funciones en Funciones Principales para lograr resultados con una sintaxis iterativa global dentro de nuestro código. Si me equivoco o tienen otra idea de su uso, estoy dispuesto a leerlos. ![](https://static.platzi.com/media/user_upload/HOF_Lambda%20py-aadacabe-14e3-4f85-9da6-497524d4f862.jpg)
Saludos, para entender un poco mejor las HOF, y las lambda escribi este codigo`. ` ```js #Usando HOF y Lambdas para generar saludos en diferentes idiomas def greeting(name): return f'HI in english {name}\n' def anotherGreeting(name, func): return f'Hola en español {name}\n' + func(name) saludar = anotherGreeting('Mark', greeting) print(saludar) # Usando lammbda function con HOF salut = lambda name, func: f'Salut je parle frances {name}\n' + func(name) result = salut('Antoine', greeting) print(result) otroResultado = salut( 'Ricardinho', lambda name: f'Saudade galera eu posso falar portugues {name}\n') saludoItaliano = anotherGreeting('Giaccomo', lambda name: f'Ciao {name}') print(otroResultado) print(saludoItaliano) ```
Les comparto un ejemplo practico de HOF ```python # Esta es nuestra función de orden superior. Toma dos argumentos: el precio y una función de descuento. # La función de descuento calculará cuánto se debe descontar del precio original. def aplicar_descuento(precio, funcion_descuento): # Calcula el descuento usando la función de descuento proporcionada descuento = funcion_descuento(precio) # Aplica el descuento al precio original y devuelve el precio final return precio - descuento # Una función simple para calcular un descuento del 10% def descuento_diez_por_ciento(precio): return precio * 0.10 # Otra función que calcula un descuento del 20% def descuento_veinte_por_ciento(precio): return precio * 0.20 # Usamos la función de orden superior para aplicar un descuento del 10% a un precio de 100 precio_final = aplicar_descuento(100, descuento_diez_por_ciento) print(f"Precio final con 10% de descuento: {precio_final}") # Usamos la misma función de orden superior para aplicar un descuento del 20% al mismo precio precio_final = aplicar_descuento(100, descuento_veinte_por_ciento) print(f"Precio final con 20% de descuento: {precio_final}") # También podemos usar una función lambda directamente si queremos aplicar un descuento único sin definir una función completa precio_final = aplicar_descuento(100, lambda precio: precio * 0.15) print(f"Precio final con 15% de descuento: {precio_final}") ```# Esta es nuestra función de orden superior. Toma dos argumentos: el precio y una función de descuento. \# La función de descuento calculará cuánto se debe descontar del precio original. def aplicar\_descuento(precio, funcion\_descuento): \# Calcula el descuento usando la función de descuento proporcionada descuento = funcion\_descuento(precio) \# Aplica el descuento al precio original y devuelve el precio final return precio - descuento \# Una función simple para calcular un descuento del 10% def descuento\_diez\_por\_ciento(precio): return precio \* 0.10 \# Otra función que calcula un descuento del 20% def descuento\_veinte\_por\_ciento(precio): return precio \* 0.20 \# Usamos la función de orden superior para aplicar un descuento del 10% a un precio de 100 precio\_final = aplicar\_descuento(100, descuento\_diez\_por\_ciento) print(f"Precio final con 10% de descuento: {precio\_final}") \# Usamos la misma función de orden superior para aplicar un descuento del 20% al mismo precio precio\_final = aplicar\_descuento(100, descuento\_veinte\_por\_ciento) print(f"Precio final con 20% de descuento: {precio\_final}") \# También podemos usar una función lambda directamente si queremos aplicar un descuento único sin definir una función completa precio\_final = aplicar\_descuento(100, lambda precio: precio \* 0.15) print(f"Precio final con 15% de descuento: {precio\_final}")
Por si a alguien le sirve, probe ingresando un parametro de entrada desde la terminal, les dejo la imagen. ![](https://static.platzi.com/media/user_upload/imagen-e3c5f3d0-8c7e-48fc-b006-42f6fcd9ff96.jpg)
Por si a alguien le interesa verlo en notación algebraica. Fue la única manera en la que pude entender lo que estaba haciendo el profesor. Tenia una confusión enorme con el "func(x)" porque no sabia de donde salía, si era una variable o un llamado de comando o cualquier otra cosa. Al poder visualizarlo en funciones algebraicas entendí: 1.La función de incremento por uno: *f*(x)= x+1 2.La función que aplica una operación a un número: *g*(y,*h*) = y+*h*(y) * y: es el número original * h: es la operación que se aplica a y Entonces podemos decir que *g*(y,h) es equivalente a y+*h*(y) 3.Llamada a la función con y=2 y *h*=*f*: *g*(2,*f*) = 2+*f*(2) * *f*(2): significa aplicar la función *f* a 2. * *f*(2) = 2 + 1 = 3 Entonces, *g*(2,*f*) es equivalente a 2+3. 1. Resultado: *g(2,f) = 2 + 3 = 5.* *Ahora en codigo:* ```python def f(x): return x+1 def g(y,h): # (y) es un valor que asignaremos, (h) es una variable que en este caso tendra una funcion asignada return y+f(x) #aqui dejamos (y) e indicamos que (h) tendra el valor de f(x) resultado = g(2,f(x)) print(resultado) #Nota (y) y (x) tendran el mismo valor , ya que en el ejemplo del profesor solo existe x, pero para poder visualizarlo mejor cree otra variable, si gustan pueden remplazar y por x ``` *Espero que esta representación algebraica pueda ayudar a alguien.*```python ```
tuve un problema con replit al no dejarme asignar en variables las lambdas, para resolverlo usé # flake8: noqa `def increment(x):` ` return x + 1` `def high_order_function(x, func):` ` return x + func(x)` `result = high_order_function(2, increment)` `# 2 + (2 + 1)` `print(result)` `# flake8: noqa` `increment_v2 = lambda x: x + 1` `high_order_function_v2 = lambda x, func: x + func(x)` `result = high_order_function_v2(2, increment_v2)` `print(result)`
Sin duda Nicolas sabe mucho, pero podria mejorar en algunas explicaciones. Me da la impresion que grabo este video de afan y este tema en particular lo podria explicar mucho mejor

genial

Este metodo es muy bueno porque te permite ver las funciones de una manera sencilla. Mas adelante, esto sera interesante.

Las funciones lambda son similar en concepto en JS cuando enviamos un callback y se ejecuta dentro de otra funcion? O es que las High Order Function tiene un sentido diferente en python?
Nooooo ¿Pero que es sto xd? estos son los temas que me llevan a decir, Adios al aprendizaje de programacion, no va mas.

Una función de orden superior es una función que toma una o más funciones como argumentos y/o devuelve una función como resultado. Esto significa que puedes tratar a las funciones como objetos de primera clase en Python y utilizarlas de manera flexible en tu código.

Un ejemplo común de función de orden superior es una función que toma otra función como argumento. Aquí tienes un ejemplo sencillo:

pythonCopy code
def aplicar(funcion, valor):
    return funcion(valor)

def cuadrado(x):
    return x * x

def cubo(x):
    return x * x * x

resultado = aplicar(cuadrado, 5)  # Aplica la función cuadrado a 5
print(resultado)  # Imprime 25

resultado = aplicar(cubo, 3)  # Aplica la función cubo a 3
print(resultado)  # Imprime 27

En este ejemplo, la función aplicar es una función de orden superior porque toma otra función (funcion) como argumento y la aplica a un valor dado (valor). Puedes ver que hemos definido dos funciones, cuadrado y cubo, que realizan operaciones diferentes. Luego, utilizamos la función aplicar para aplicar estas funciones a valores específicos.

Este es solo un ejemplo básico de una función de orden superior. Python proporciona muchas funciones de orden superior incorporadas, como map(), filter(), y sorted(), que te permiten realizar operaciones en listas u otros objetos utilizando funciones personalizadas.

Las funciones de orden superior son poderosas porque te permiten abstraer y reutilizar lógica de manera eficiente, lo que hace que tu código sea más modular y legible. También son útiles en la programación funcional y en la escritura de código más declarativo.

Hice este bloque de código queriendo practicar este concepto, podrían aclararme sí me quedó bien y sí realmente es una HOF. Agradezco cualquier aporte y corrección para seguir aprendiendo<3


def saludar():
    return 'hola'

def saludar_con_nombre(funcion, nombre):
    return saludar() + ' ' + nombre

nombre = 'david'
saludo = saludar_con_nombre(saludar, nombre)
print(saludo) #hola david

High order functions + lambda: Una HOF es una función que puede recibir otras funciones como argumentos y/o devolver funciones como resultados. Las lambdas en este caso pueden usarse como argumentos dentro de las high order function para hacerlo de una forma más dinámica y poder jugar. Esto significa que puedes tratar las funciones como objetos de primera clase en Python, lo que te permite realizar operaciones avanzadas de programación funcional, como mapeo, filtrado y reducción de datos.

EXPLICACION DEL PRIMER EJEMPLO

Es mucho texto pero si tienen dudas sobre el funcionamiento del código vale la pena leerlo.

def incremento(x):
    return x + 1

def hof(x, func):
    return x + func(x)

resultado = hof(2, incremento)
print(resultado)
  1. Se define una función llamada incremento(x) que toma un argumento x y devuelve x + 1. En otras palabras, esta función toma un número x y devuelve el número siguiente a x.

  2. Se define otra función llamada hof(x, func) que toma dos argumentos: x y func. La función hof toma un número x y una función func, y devuelve x + func(x). Esto significa que toma el número x, aplica la función func a x y luego suma el resultado de func(x) a x.

  3. Se llama a la función hof(2, incremento). En este caso, se pasa 2 como el valor de x y incremento como el valor de func. Esto significa que estamos llamando a hof con x = 2 y func = incremento.

  4. Dentro de la función hof, se aplica la función func (que es incremento en este caso) a x, que es 2. Entonces, func(2) se convierte en incremento(2), lo cual es 2 + 1, lo que resulta en 3.

  5. Luego, se suma x (que es 2) y el resultado de func(2) (que es 3), lo que da como resultado 2 + 3, que es 5.

  6. Finalmente, el valor resultante de 5 se almacena en la variable resultado.

  7. Se imprime el valor de resultado, que es 5.

En resumen, este código demuestra cómo puedes pasar funciones como argumentos a otras funciones. En este caso, la función hof toma un número y una función como argumentos, aplica la función al número y luego realiza una operación adicional con el resultado. En este ejemplo específico, se utiliza la función incremento para aumentar el número 2 en 1, lo que da como resultado 5.

También se conocen como funciones de orden superior, el cual con ellas se pueden pasar funciones como argumentos para que se ejecuten, manipulen o modifiquen dentro de otra función. Por otra parte, no es necesario declarar funciones, usando la palabra clave lambda se puede pasar como argumento una de una función. Las HOF se usan mucho en el paradigma de programación funcional.

def increment (x):
return x+1

increment_v2 = lambda x: x+1

def high_order_function (x, func):
return x + func(x)

high_order_function_v2 = lambda x, func : x + func (x)

result = high_order_function(2,increment)
print(result)

result = high_order_function_v2(2,increment_v2)
print(result)

result = high_order_function_v2(2, lambda x: x + 2)
print(result)

result = high_order_function_v2 (2,lambda x: x * 5)
print(result)

#other example high order function
def list1():
    lista1 = []
    for i in range(1,10):
        lista1.append(i)
    return lista1
def lista_principal(func):
    lista_madre = [12,32,1232,212,231,12]
    return lista_madre + func()
result = lista_principal(list1)
print(result)

Una función de orden superior, o high-order function en inglés, es una función que puede recibir otras funciones como argumentos y/o devolver funciones como resultado. En Python, las funciones son objetos de primera clase, lo que significa que pueden ser tratadas como cualquier otro objeto, como enteros, cadenas o listas. Esta característica permite que las funciones sean pasadas como argumentos a otras funciones y que sean devueltas como resultados de funciones.

Aquí hay un ejemplo para ilustrar el concepto de high-order function en Python:

def aplicar_operacion(funcion, x, y):
    return funcion(x, y)

def suma(a, b):
    return a + b

def resta(a, b):
    return a - b

resultado = aplicar_operacion(suma, 3, 2)
print(resultado)  # Imprime: 5

resultado = aplicar_operacion(resta, 3, 2)
print(resultado)  # Imprime: 1

En este ejemplo, la función aplicar_operacion es una high-order function porque recibe una función (funcion) como argumento. Dependiendo de la función que se pase como argumento, aplicar_operacion realizará una operación diferente entre los argumentos x e y.

En la primera llamada a aplicar_operacion, se pasa la función suma como argumento, por lo que se realiza una suma entre 3 y 2, devolviendo 5. En la segunda llamada, se pasa la función resta, por lo que se realiza una resta entre 3 y 2, devolviendo 1.

Las high-order functions son especialmente útiles en situaciones donde se necesita abstraer cierta lógica común y parametrizarla mediante funciones. Al utilizar high-order functions, se promueve la reutilización de código y la modularidad, ya que se pueden crear funciones genéricas que trabajen con diferentes implementaciones específicas.

Así pues, una high-order function en Python es aquella que puede recibir funciones como argumentos y/o devolver funciones como resultado. Esto permite una mayor flexibilidad y reutilización de código al parametrizar la lógica de las funciones.

Poderoso concepto para ahorrar líneas

funciones de orden superior, una funcion tambien puede recibir una función que a su ves recibe una función y ser ejecutada

Interesante siempre me costó esto al principio, es super sencillo!

Veo mucho comentario, donde dicen que el profe no es organizado con las explicaciones que hace, que trabaja sobre el mismo código y bla bla bla, por tanto quiero dar mi punto de vista.

• la vida no todo te lo va poner en bandeja de plata, si ves que algo no esta como quiere, hazlo tu, en este caso organiza tu código de tal forma que quede mas explicativo, en el mundo laboral habrá cosas que te va tocar rebuscarte para darle solución, No te acostumbres a que todo te lo tienen que dar a la mano, sal de esa zona.

y ahora les comparto como organicé mi codigo para entenderlo cuando tenga dudas del uso del HOF

def increment(x = 5):
  return x + 1

def higher_order_function(x, func):
  return x + func(x)

#tener presente que el parametro de la funcion es su nombre sin ejecutar, es decir sin los parentesis
result = higher_order_function(2, increment)
print('result → ', result)

#version lambda higher order function
increment_v2 = lambda x : x + 1
higher_order_function_v2 = lambda x, func : x +func(x)
result_v2 = higher_order_function_v2(2, increment_v2)
print('result_v2 → ',result_v2)
# no es necesario definir la funcion lambda para ejecutarla, como parametro de la funcion es suficiente 
higher_order_function_v3 = lambda x, func : x +func(x)
result_v3 = higher_order_function_v3(2, lambda x: x + 1)
print('result_v3 → ', result_v3)

Super el concepto se empieza a ver mas pro.

def increment(x):
  return x + 1

increment_v2 = lambda x: x+1

def high_ord_func(x, func):
  return x + func(x)

high_ord_func_v2 = lambda x, func:x + func(x)

result = high_ord_func(2, increment)
print(result)

result = high_ord_func_v2(2, increment_v2)
print(result)
result = high_ord_func_v2(2, lambda x:x+2)
print(result)
result = high_ord_func_v2(2, lambda x:x*5)
print(result)
  

Mis notas de la clase “13_hof.py”


def increment(x):
  return x + 1 

def high_ord_func(x, func):
  return x + func(x)

result = high_ord_func(2, increment)
# 2 + (2 + 1)
print(result)

# realizar la funcion con lambda en ambas funciones
def increment(x):
  return x + 1 
increment_v2 = lambda x: x + 1

def high_ord_func(x, func):
  return x + func(x)
high_ord_func_v2 = lambda x, func: x + func(x)

result = high_ord_func_v2(2, increment_v2)
# 2 + (2 + 1)
print(result)

# lambda directo a la funcion
result = high_ord_func_v2(lambda x: x + 2)

# change
result = high_ord_func_v2(2, lambda x: x * 5)
print(result)

me explico mejor chat gpt , que esta clase…!!!

@Nicolas Molaina: en los apunted de la clase lo tienes asi high_ord_func_v2 = lambda x, func: x + func(x)… de acuerdo a lo que entiendo deberia ser increment2=lambda x, func: x + func(x)… tal vez esto este generando tambien confusion.

buscando una definicion mas clara, en Python, una Higher Order Function (función de orden superior) es una función que acepta otra función como argumento y/o devuelve una función como resultado.

En otras palabras, una función de orden superior es aquella que trata a una función como si fuera una variable común. Esto permite que las funciones de orden superior sean extremadamente flexibles y útiles, ya que permiten una programación más modular y abierta.

def aplicar_operacion(num, funcion):
    return funcion(num)

def cuadrado(x):
    return x ** 2

resultado = aplicar_operacion(3, cuadrado)
print(resultado)  # Output: 9

En este ejemplo, aplicar_operacion es una función de orden superior que acepta dos argumentos: un número y una función. En este caso, la función es cuadrado, que eleva al cuadrado su argumento. La función aplicar_operacion llama a la función cuadrado con el número dado y devuelve el resultado

Muy buena clase profesor Nicolas 👍

HOF son funciones que toma una o más funciones como argumentos y/o devuelve una función como resultado. Las funciones de orden superior son muy útiles en programación funcional, donde se considera que las funciones son valores de primera clase (es decir, pueden ser asignadas a variables, pasadas como argumentos y devueltas como resultados).

Las funciones de orden superior se utilizan para abstraer el comportamiento común de varias funciones similares, permitiendo la reutilización de código y la construcción de aplicaciones más flexibles y modulares.

Algunos ejemplos comunes de funciones de orden superior en Python son:

  • map(función, iterable): toma una función y un iterable como argumentos, y devuelve un nuevo iterable con el resultado de aplicar la función a cada elemento del iterable.

  • filter(función, iterable): toma una función y un iterable como argumentos, y devuelve un nuevo iterable que contiene solo los elementos del iterable para los que la función devuelve True.

  • reduce(función, iterable): toma una función y un iterable como argumentos, y devuelve un solo valor que es el resultado de aplicar la función a los elementos del iterable de forma acumulativa.

  • sorted(iterable, key=función): toma un iterable y una función opcional como argumentos, y devuelve una lista ordenada de los elementos del iterable en función del valor que devuelve la función para cada elemento.

Por ejemplo, podemos definir una función de orden superior que toma una función f y un número x, y devuelve el resultado de aplicar f a x dos veces:

"""Usando la función de orden superior con la función lambda "doble" definida en la pregunta anterior"""

def doble_aplicacion(f, x):
    return f(f(x))
resultado = doble_aplicacion(lambda x: x*2, 3) 

# resultado es 12

En este ejemplo, doble_aplicacion es una función de orden superior porque toma una función (f) como argumento y devuelve el resultado de aplicar f dos veces a un valor (x). Podemos llamar a esta función con diferentes funciones, como la función lambda lambda x: x*2 que definimos anteriormente, para obtener diferentes resultados.

Explicación mas sencilla:
Función de orden superior: es una función que toma una o más funciones como argumentos y/o devuelve una función como resultado.

Funciones anónimas, también conocidas como funciones lambda, son funciones sin nombre que se pueden definir y utilizar en una sola línea de código. Son útiles cuando necesitas definir una función simple y no quieres crear una función con un nombre definido.

Algunas cosas las explico de manera mas complicada, pero busquen en YouTube o en Google, y encontraran explicaciones mas sencillas. Luego regresen aquí y repasen.

def increment(x):
    return x + 1


def increment_v2(x): return x + 1


def high_ord_func(x, func):
    return x + func(x)


result = high_ord_func(2, increment)
print(result)

Excelente clase! Aunque el concepto inicialmente puede tornarse un poco confuso, pero como todo es cuestión de práctica.

Les comparto el código de la clase

# Higher order function: una función dentro de otra función

# A una funcion, le podemos enviar otra funcion como argumento y ejecutarla desde ahi

# Haciendo uso de funciones
def increment(x):
  return x + 1

def high_ord_func(x, func):
  return x + func(x)

result = high_ord_func(2, increment)
# 2 + (2 + 1) = 5
print(result)

# Haciendo uso de labmda functions
increment_v2 = lambda x: x + 1

high_ord_func_v2 = lambda x, func: x + func(x)

result = high_ord_func_v2(2, increment_v2)
print(result)

result = high_ord_func_v2(2, lambda x: x + 2)
print(result)

result = high_ord_func_v2(2, lambda x: x * 5)
print(result)

Así lo hice yo

#Metodo tradicional
def increment(x):
  return x + 1

def high_ord_func(x, func):
  return x + func(x)

result = high_ord_func(2, increment)
# 2 + (2+1)
print(result)

#Con funciones lambda
increment_v2 = lambda x : x + 1
high_ord_func_v2 = lambda x, func: x + func(x)

result2 = high_ord_func_v2(2, increment_v2)
# 2 + (2+1)
print(result2)

print(high_ord_func_v2(2, lambda x : x + 1))
print(high_ord_func_v2(2, lambda x : x + 2))
print(high_ord_func_v2(2, lambda x : x * 3))

Ejemplo del mismo tema con una calculadora.

def fun_operacion():
    operacion = fun_captura()
    return eval(operacion)

def fun_captura():
    numero_operacion = input("Introduce la operación: ")
    return numero_operacion

resultado = fun_operacion()
print(resultado)

Y ahora resumo la calculadora con lambda.

captura = lambda: input("Introduce la operación: ")
operacion = lambda x: eval(x)

resultado = operacion(captura())
print(resultado)
def run():
    x = 2
    y = 3

    def squaring(x):
        return x**2
    
    def aritmetic(y, func):
        return y * (2 + func(x))
    
    result = aritmetic(y,squaring)
    print(result)
#/////////////////////////////////
#/////////////////////////////////
    squaringtwo = lambda x: x**2
    aritmeticstwo = lambda y, func2: y*(2 + func2(x))

    print(aritmeticstwo(y, squaringtwo))

if __name__ == '__main__': 
    run()
'''
HOF
Higher order function
Una funcion dentro de otra funcion
'''

def increment(x):
    return x+1

def higher_ord_func(x,func):
    return x + func(x)

print(higher_ord_func(3,increment))
 
higher_ord_func_v2=lambda x,func:x+func(x)

print(higher_ord_func_v2(3,increment))
print((lambda x,func:x+func(x))(3,increment))

result=higher_ord_func_v2(2,lambda x:x+2)
print(result)
result=higher_ord_func_v2(2,lambda x:x*2)
print(result)

Cuando es que van a poner “Me gusta esta clase”?

Super, me encanto esta clase

yo lo hice de esta forma y me funciono

def increment (x):
    return x+1

increment_v2 =lambda x :x+1

def higher_ord_function(x,func):
    return x + func(x)


result=higher_ord_function(2,increment)
# 2 + (2+1)

result_lambda=higher_ord_function(2,increment_v2)
print(result)
print(result_lambda)

Vaya, vayaaaa, cosa mas interesante

😄

Esto se está poniendo muy cool:

increment = lambda number: number + 1

high_order_function = lambda value, function: value + function(value)

result = high_order_function(5, increment)
# 5 + (5+1)
print(result)

  • A higher-order function is a function that takes one or more functions as arguments, or returns a function as its result. In other words, a higher-order function is a function that operates on or with functions.

  • Higher-order functions are a useful concept in programming because they allow you to abstract over actions, not just values. This can make it easier to write code that is flexible, reusable, and easy to understand.

Here is an example of a higher-order function in Python that takes a function as an argument:

def apply_twice(func, arg):
  return func(func(arg))

def add_five(x):
  return x + 5

print(apply_twice(add_five, 10))  # Output: 20

  • In this example, apply_twice is a higher-order function that takes a function func and an argument arg, and applies func to arg twice. The function add_five is passed as the func argument, and the result is the same as calling add_five(add_five(10)), which is 20.
def increment(x):
  return x + 1

increment_v2 = lambda x: x+1

def high_ord_func(x, func):
  return x + func(x)

high_ord_func_v2 = lambda x, func: x +func(x)

result = high_ord_func(2, increment)
# 2 + (2+1)
print(result)
result = high_ord_func_v2(2, increment_v2)
print(result)
result = high_ord_func_v2(2, lambda x: x+2)
## charge
print(result)
result = high_ord_func_v2(2, lambda x: x*5)
print(result)

me parecen muy utiles para cosas cortas pero no pretender hacer una mega lambda function que despues sea complicado de leer o modificar.

Todos los días aprendemos algo nuevo, el día que digas que ya sabes todo, ese día entraste en zona de confort.
Gracias por sus clases

  • Una función se llama función de orden superior si contiene otras funciones como parámetros o funciones de retorno. Es un concepto importante. Python, como lenguaje de programación muy flexible, admite el uso de funciones de orden superior. Hay algunas funciones integradas de orden superior en Python y también podemos definir funciones de orden superior por nosotros mismos.

Geniarl aprender las High order function!

Espero que ayude a entenderlo. ![](https://static.platzi.com/media/user_upload/hof%20py-3ad7b7a1-79d4-477e-ac49-481026b1e93e.jpg)