myList = ['100', 'sin(x)', '0', '1']
我从文本文件中读取这些字符串。我现在想要从该字符串执行函数调用 sin(x) - 我希望这是对任何函数表达式的字符串的一般解释。
我试过以下但没有成功。
myList[1].replace("'", "")
我想我要问的是如何从列表中提取字符串并使用它的“原始文本”可以这么说。
最终目标是获得此函数,myList [1]应转向sin(x)
from math import sin
def f(x):
return myList[1]
因此f(x)将从该列表中给出sin(x)的计算值。
答案 0 :(得分:3)
使用dict并将其存档
from math import sin
myList = ['100', 'sin(x)', '0', '1']
options = { 'sin(x)':sin }
options[myList[1]](1)
0.8414709848078965
答案 1 :(得分:2)
您将字符串值与可执行代码混淆。两个基本点:
您尝试整体做什么?如果你想用文本输入触发trig函数,你可以更好地使用枚举检查来完成它,例如:
choice = myList[1]
if choice == "sin":
return sin(x)
elif choice == "cos":
return cos(x)
...
答案 2 :(得分:1)
我能看到的最安全的方法是将预期的函数存储在字典中,如下所示:
math_dict = {'sin(x)':sin, 'cos(x)':cos}
然后你可以像这样从列表中调用sin:
def f(x):
return math_dict[myList[1]](x)
我刚刚添加了cos(x)来表明你可以用任意函数做到这一点。然后你可以做这样的事情来概括它:
def f(x):
return math_dict[x] if x in math_dict else None
答案 3 :(得分:1)
Sin函数是数学库的一部分,你可以得到它:
import math
getattr(math, 'sin')
对于所有非内置库,这都是相同的。只需将字符串拆分为获取函数名称:
function_name = myList[1].split('(')[0]
function = getattr(math, function_name)
function(value for x)
对于像round这样的内置函数:
getattr(globals()['__builtins__'], 'round')
答案 4 :(得分:0)
使用sympy.sympify并突出显示警告
警告:
sympify
使用eval
。不要在未经过消毒的输入上使用它。
你可以解决这个问题
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)
或用于多点评估用
替换最后一行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))*(b-a)/N