在python中将公式作为函数参数传递
我想在Python中的函数参数中传递一个公式,公式是其他函数参数的组合。原则上是这样的:在python中将公式作为函数参数传递,python,function,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中有类似的功能吗?还有其他想法吗? 谢谢,您的“myFormul
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中有类似的功能吗?还有其他想法吗?
谢谢,您的“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)
使用,可以计算数学表达式:
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
,这使得应用于任意用户输入不安全
因为字符串可以组合为
一个更安全的选择是构建一个解析器来解析严格受限的数学表达式。
这里有几个例子
def myFormula(x,y,z):
return lambda x,y,z: x+2*y/z
这样,您就不必定义新函数,也不必传递任何额外的参数
有关lambda函数的其他信息:
听起来像是
eval
的工作。不管怎样,这个主题都有很多线索。可能是@Havenard的重复不,这不是重复的,我会用lambda代替。eval太危险了,感谢所有这些不同的解决方案@unubtu,问题已更正。传递给myFormula
的参数x
、y
和z
被忽略;返回的函数只是一个包含3个参数的函数。suggestreturn expr.subs(kwargs)
可以计算print(myformula(x=2,y=2,z=1,formula=“x+2*y/z>0”)
@Azat:不幸的是,这改变了第二个示例的行为。@unutbu也在寻找答案,并决定查看文档以了解更多信息。我注意到文件上说sympify使用了“eval”,因此应该受到同样的审查。。。或者我可能遗漏了一些东西,因为我是一名初级程序员:另外,如果您仍然处于活动状态,那么如果“我的公式”包含一些与您要传递的算术表达式不直接相关的附加参数,该怎么办?是不是我用一个星号而不是两个星号?