在Python中将公式作为函数参数传递
我想在Python中把一个公式作为函数的参数传递,这个公式是由其他函数参数组合而成的。原则上,这看起来像这样:
myfunction(x=2,y=2,z=1,formula="x+2*y/z")
6
或者更一般来说:
def myformula(x,y,z,formula):
return formula(x,y,z)
这样用户就可以根据x、y和z选择任何算术表达式,而不需要创建一个新的函数。
我想到的一种可能性是把字符串在函数内部转换成代码。Python里有这样的实现吗?或者有没有其他的想法?谢谢!
3 个回答
0
你可以试试用一个叫做“lambda”的函数。像这样可能会对你有帮助:
def myFormula(x,y,z):
return lambda x,y,z: x+2*y/z
这样你就不需要定义一个新的函数,也不用额外传递什么参数。
关于lambda函数的额外信息:http://www.diveintopython.net/power_of_introspection/lambda_functions.html
http://pythonconquerstheuniverse.wordpress.com/2011/08/29/lambda_tutorial/
2
你的“myFormula”其实和普通的lambda表达式没什么太大区别,只不过多了一个麻烦,就是需要把一个字符串解析成可以执行的Python代码。
(lambda x,y,z: x + 2*y/z)(5, 2, 10)
所以,你可以简单地把myFormula
定义为
def myFormula(*args, formula):
formula(*args)
然后这样调用它
myFormula(5, 2, 10, lambda x, y, z: x + 2*y/z)
9
使用sympy,你可以计算数学表达式:
import sympy as sy
def myformula(formula, **kwargs):
expr = sy.sympify(formula)
return expr.evalf(subs=kwargs)
print(myformula(x=2,y=2,z=1,formula="x+2*y/z"))
# 6.00000000000000
print(myformula(x=2,y=2,z=1,formula="sin(x+y-z)"))
# 0.141120008059867
但是要注意,sympy.sympify
确实使用了eval
,这让它在处理用户输入时不太安全,因为字符串可以被构造得让eval
执行任意的Python代码,可能会造成安全隐患。你可以查看这篇文章了解更多。
一个更安全的选择是构建一个解析器,只解析严格限制的数学表达式。这里有几个例子: