##############################################################[br]#Ejemplos en Python usando la librería functools.[br][br]#1. Utilizar `partial` para crear una función con argumentos predefinidos:[br]import functools[br][br]# define una función con dos argumentos[br]def suma(a, b):[br] return a + b[br][br]# utiliza partial para crear una nueva función con el argumento 'a' predefinido como 5[br]suma_con_5 = functools.partial(suma, a=5)[br][br]# llama a la función con el argumento 'b' específico (3)[br]resultado = suma_con_5(b=3)[br][br]# imprime el resultado (8)[br]print(resultado)[br][br]#2. Utilizar `reduce` para aplicar una función a todos los elementos de una lista:[br]import functools[br][br]# define una lista de números[br]numeros = [1, 2, 3, 4, 5][br][br]# utiliza reduce para sumar todos los números en la lista[br]suma_total = functools.reduce(lambda x, y: x + y, numeros)[br][br]# imprime la suma total (15)[br]print(suma_total)[br][br]#3. Utilizar `cached_property` para cachear el resultado de un método:[br]import functools[br][br]# define una clase con un método costoso en términos de procesamiento[br]class Ejemplo:[br] @functools.cached_property[br] def resultado_costoso(self):[br] # realiza algún procesamiento costoso aquí[br] return 42[br][br]# crea una instancia de la clase y llama al método varias veces[br]ejemplo = Ejemplo()[br]print(ejemplo.resultado_costoso)[br]print(ejemplo.resultado_costoso)[br]print(ejemplo.resultado_costoso)[br][br]#4. Utilizar `wraps` para decorar una función sin perder su información original:[br]import functools[br][br]# define una función decoradora que imprime un mensaje antes y después de la función decorada[br]def mi_decorador(funcion):[br] @functools.wraps(funcion)[br] def wrapper(*args, **kwargs):[br] print('Antes de la función')[br] resultado = funcion(*args, **kwargs)[br] print('Después de la función')[br] return resultado[br] return wrapper[br][br]# define una función que será decorada[br]@mi_decorador[br]def mi_funcion():[br] print('En la función')[br][br]# llama a la función decorada[br]mi_funcion()[br][br][br]#5. Utilizar `total_ordering` para definir los métodos de comparación en una clase:[br]import functools[br][br]# utiliza total_ordering para definir los métodos de comparación en la clase[br]@functools.total_ordering[br]class MiClase:[br] def __init__(self, valor):[br] self.valor = valor[br][br] def __eq__(self, otro):[br] return self.valor == otro.valor[br][br] def __lt__(self, otro):[br] return self.valor < otro.valor[br][br]# crea dos instancias de la clase y compáralas[br]instancia1 = MiClase(1)[br]instancia2 = MiClase(2)[br][br]print(instancia1 == instancia2)[br]print(instancia1 < instancia2)[br]