es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Sí, hay otra manera de combinar a y b para crear una nueva función ab. Una forma es utilizar la función lambda para crear una función anónima que combine las dos funciones. Aquí tienes un ejemplo:

    a = lambda x: 0.2 * x[1] - 0.4 * x[0]
    b = lambda x: 0.4 * x[0] - 0.2 * x[1]
    ab = lambda x: [a(x), b(x)]
    

    En este ejemplo, a y b se definen como funciones lambda, y ab se define como una función lambda que llama a a y b y devuelve sus resultados como una lista.

    Alternativamente, puedes utilizar la función functools.partial para crear una nueva función que tome a y b como argumentos y devuelva una nueva función que llame tanto a a como a b. Aquí tienes un ejemplo:

    from functools import partial
    
    def a(x):
        return 0.2 * x[1] - 0.4 * x[0]
    
    def b(x):
        return 0.4 * x[0] - 0.2 * x[1]
    
    def ab(x):
        return [f(x) for f in ab.funcs]
    
    ab.funcs = [a, b]
    ab = partial(ab, funcs=ab.funcs)
    

    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 atributo ab.funcs se utiliza para almacenar la lista de funciones, y la función partial se utiliza para crear una nueva función que solo toma el argumento x y llama a ab con la lista de funciones almacenada. De esta manera, la lista ab.funcs no necesita reconstruirse cada vez que se llama a ab.

Comments are closed.