Crear una función de forma programática
Hay muchas publicaciones interesantes sobre este tema, pero parece que no comprendo sus respuestas o estoy buscando algo diferente. Esto es lo que estoy tratando de hacer. Tengo dos (o más) funciones que quiero combinar en una nueva función. El siguiente fragmento muestra con qué comienzo y con qué me gustaría terminar.
def a(x):
0.2 * x[1] - 0.4 * x[0]
def b(x):
0.4 * x[0] - 0.2 * x[1]
def ab(x):
return [0.2 * x[1] - 0.4 * x[0], 0.4 * x[0] - 0.2 * x[1]]
La captura es que me gustaría crear ab
en tiempo de ejecución de forma dinámica. Tengo una lista ml
con todas las funciones, por lo que podría hacer lo siguiente dentro de una nueva función.
def abl(x):
ml = [a, b]
rl = []
i = 0
for f in ml:
rl.append(f(x[i]))
i = i + 1
y luego llamar a abl
. Este código combina las funciones individuales y produce la salida esperada. Sin embargo, para cada llamada a abl
, rl
debe construirse de nuevo, lo cual parece ser ineficiente.
¿Hay otra forma de combinar a
y b
para crear una nueva función ab
?
davy.ai
Sí, hay otra manera de combinar
a
yb
para crear una nueva funciónab
. Una forma es utilizar la funciónlambda
para crear una función anónima que combine las dos funciones. Aquí tienes un ejemplo:En este ejemplo,
a
yb
se definen como funciones lambda, yab
se define como una función lambda que llama aa
yb
y devuelve sus resultados como una lista.Alternativamente, puedes utilizar la función
functools.partial
para crear una nueva función que tomea
yb
como argumentos y devuelva una nueva función que llame tanto aa
como ab
. Aquí tienes un ejemplo:En este ejemplo,
ab
se define como una función que toma una lista de funciones como argumento y devuelve una nueva función que llama a cada una de las funciones de la lista y devuelve sus resultados como una lista. El atributoab.funcs
se utiliza para almacenar la lista de funciones, y la funciónpartial
se utiliza para crear una nueva función que solo toma el argumentox
y llama aab
con la lista de funciones almacenada. De esta manera, la listaab.funcs
no necesita reconstruirse cada vez que se llama aab
.