Estoy haciendo un programa de creación de gráficos en python y necesito pasar una ecuación como parámetro en una función (según sea necesario para crear un gráfico) y en esa ecuación necesito algunas variables que cambian mientras se ejecuta la función.

Gracias por ayudar es muy apreciada.

He tratado de encontrar soluciones, pero no soy tan bueno, así que no entiendo y qué explicación si puedes.

#inside a class and this is also simplified.
def function(self, e):
    x = 0
    for i in range(100):
        print(e)
        x += 1

classObj.function(x * 2)


Espero que pueda agregar la variable x en el parámetro e para que pueda ser más flexible, pero esa variable se crea funciones para el bucle.

1
Viggo Skjönsberg 11 oct. 2019 a las 18:36

3 respuestas

La mejor respuesta

Las expresiones de argumento se evalúan antes llamando a la función.

Si desea pasar algo dinámico, use una función de devolución de llamada. Si la función es simple, se puede escribir como lambda.

def function(self, f):
    for i in range(100):
        print(f(i))

classObj.function(lambda x: x * 2)
2
Barmar 11 oct. 2019 a las 15:43

No estoy seguro de haber entendido su pregunta correctamente, pero en Python puede pasar una función como parámetro. Para describirlo, decimos que las funciones son ciudadanos de primera clase o que un idioma admite funciones de orden superior.

Aquí hay un ejemplo de cómo puedes lograrlo:

class YourClass:
    def function(self, e):
        x = 0
        for i in range(100):
            result = e(x)  # you can call a function passed as a parameter
            print(result)  # do something with a result
            x += 1


def multiply_by_2(x):
    return x * 2


def add_2(x):
    return x + 2


obj = YourClass()
obj.function(multiply_by_2)  # just use function name without parenthesis
obj.function(add_2)  # you can also pass different function!
2
glu 11 oct. 2019 a las 15:46

Como no ha definido x, recibirá un error cuando llame a classObj.function(). Puede pasar la ecuación como una cadena y llamar a exec() o eval() en ella.

Por ejemplo:

def function(self, e):
    x = 0
    for i in range(100):
        print(exec(e))
        print(eval(e))# does same thing as above line
        x += 1

classObj.function("x * 2")

La diferencia entre eval() y exec() es que eval() solo eval usa una expresión, pero exec() puede ejecutar grandes porciones de código. Recomiendo usar solo lo que sea necesario, por lo que exec() sería excesivo.

Tal vez vea esta publicación sobre cómo pasar expresiones a funciones, pero no estoy seguro de si eso es lo que usted querer.

-1
J Hearn 11 oct. 2019 a las 15:54
58344508