我想在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中有什么可能吗?还是其他任何想法? 感谢
答案 0 :(得分: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
,这使得应用于任意用户输入不安全
因为字符串可以组成trick eval
into executing arbitrary Python code。
更安全的替代方法是构建解析器来解析严格限制的数学表达式。 以下是一些例子
答案 1 :(得分: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)
答案 2 :(得分: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/