Cadena en la lista, en una función

myList = ['100', 'sin(x)', '0', '1'] 

Leí estas cadenas de un archivo de texto. Ahora quiero ejecutar la función llamada sin (x) desde esa cadena. Quiero que sea una interpretación general de la cadena para cualquier expresión de función.

He intentado lo siguiente sin éxito.

 myList[1].replace("'", "") 

Supongo que lo que pregunto es cómo extraer una cadena de una lista y usar su “texto en bruto”, por así decirlo.

El objective final es obtener esta función, donde myList [1] debe cambiar a sin (x)

 from math import sin def f(x): return myList[1] 

Así, f (x) dará el valor calculado de sin (x) de esta lista.

usa dict y lo archivas

 from math import sin myList = ['100', 'sin(x)', '0', '1'] options = { 'sin(x)':sin } options[myList[1]](1) 0.8414709848078965 

Estás confundiendo un valor de cadena con un código ejecutable. Dos puntos básicos:

  1. Puedes hacer esto con la función eval , que evalúa una cadena como código Python.
  2. No lo hagas De Verdad; eval es una pistola cargada apuntada a su pie, y generalmente indica un diseño de sistema deficiente.

¿Qué es lo que estás tratando de hacer en general? Si desea activar las funciones trigonométricas con el ingreso de texto, es mejor que lo haga con las comprobaciones enumeradas, como:

 choice = myList[1] if choice == "sin": return sin(x) elif choice == "cos": return cos(x) ... 

La forma más segura que puedo ver para hacer esto es almacenar las funciones esperadas en un diccionario como este:

 math_dict = {'sin(x)':sin, 'cos(x)':cos} 

entonces puedes llamar al pecado de la lista así:

 def f(x): return math_dict[myList[1]](x) 

Acabo de agregar cos (x) para mostrar que puedes hacer esto con cualquier función arbitraria. Entonces podrías hacer algo como esto para generalizarlo:

 def f(x): return math_dict[x] if x in math_dict else None 

La función Sin es parte de la biblioteca matemática, puedes obtenerla como:

 import math getattr(math, 'sin') 

Eso es igual para todas las bibliotecas no incorporadas. Solo divide la cadena para obtener el nombre de la función:

 function_name = myList[1].split('(')[0] function = getattr(math, function_name) function(value for x) 

Para funciones incorporadas como round:

 getattr(globals()['__builtins__'], 'round') 

Con sympy.sympify y resaltando la advertencia

Advertencia : sympify utiliza eval . No lo use en entradas no saneadas.

puedes resolver esto como

 myList = ['100', 'sin(x)', '0', '1'] from sympy.abc import x from sympy import sympify N, expr, a,b = myList # convert strings to objects N=int(N); a=float(a); b=float(b); expr = sympify(expr) # define user function def f(xval): return expr.subs(x,xval) 

o para la evaluación multipunto, reemplace la última línea con

 from sympy import lambdify f = lambdify(x, expr, "numpy") # integrate as left Riemann sum (order 1) from numpy import linspace xlist = linspace(a,b,N) integral = sum(f(xlist))*(ba)/N