在python中将公式作为函数参数传递

时间:2014-05-15 19:39:33

标签: python function

我想在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 :(得分: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/

https://docs.python.org/2/reference/expressions.html#lambda