Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中将公式作为函数参数传递_Python_Function - Fatal编程技术网

在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

我想在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中有类似的功能吗?还有其他想法吗? 谢谢,您的“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
,这使得应用于任意用户输入不安全 因为字符串可以组合为

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


您可以尝试使用lambda函数。这样的东西可能适合你:

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个参数的函数。suggest
return expr.subs(kwargs)
可以计算
print(myformula(x=2,y=2,z=1,formula=“x+2*y/z>0”)
@Azat:不幸的是,这改变了第二个示例的行为。@unutbu也在寻找答案,并决定查看文档以了解更多信息。我注意到文件上说sympify使用了“eval”,因此应该受到同样的审查。。。或者我可能遗漏了一些东西,因为我是一名初级程序员:另外,如果您仍然处于活动状态,那么如果“我的公式”包含一些与您要传递的算术表达式不直接相关的附加参数,该怎么办?是不是我用一个星号而不是两个星号?