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

4 投票
3 回答
13638 浏览
提问于 2025-04-18 06:42

我想在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/

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

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代码,可能会造成安全隐患。你可以查看这篇文章了解更多。

一个更安全的选择是构建一个解析器,只解析严格限制的数学表达式。这里有几个例子:

撰写回答