我正在尝试计算 x0 处的函数
f = lambda x:mu*div2d(grad2d(x))+x-b
Run Code Online (Sandbox Code Playgroud)
我试过这个:
def feval(f, *args):
return eval(f)(*args)
feval(f,x0)
Run Code Online (Sandbox Code Playgroud)
但它会引发回溯:
Traceback (most recent call last):
File "<ipython-input-128-6be96feb06d6>", line 1, in <module>
feval(f,x0)
File "<ipython-input-126-67b053764219>", line 2, in feval
return eval(f)(*args)
TypeError: eval() arg 1 must be a string, bytes or code object
Run Code Online (Sandbox Code Playgroud)
我还读到使用 eval() 是不好的做法。那么这样做的好方法是什么?谢谢。
该eval函数像计算源代码一样计算字符串。1例如,eval("f(*args)")会执行与直接调用相同的操作f(*args)。
但你没有源代码,你有一个函数。要调用函数,您所要做的就是:
\n\nreturn f(*args)\nRun Code Online (Sandbox Code Playgroud)\n\nf您将函数作为参数而不是直接从def语句或表达式获取并不重要lambda。函数值只是对象,就像 Python 中的其他任何东西一样,您可以像任何其他值一样传递它们,然后在需要时调用它们。
但实际上,根本不需要这个功能。而不是这个:
\n\nfeval(f, x0)\nRun Code Online (Sandbox Code Playgroud)\n\n\xe2\x80\xa6 你可以直接调用它:
\n\nf(x0)\nRun Code Online (Sandbox Code Playgroud)\n\n您需要类似的东西的唯一原因feval是,如果其他人分别向您传递了一个函数和一堆参数,并且您需要将它们放在一起进行函数调用。Python 曾经有一个用于此目的的函数 ,apply但它很久以前就被删除了,因为它几乎从来没有必要,并且如果有必要的话,也可以使用单行代码。
\n\n\n我还读到使用 eval() 是不好的做法。
\n
通常是这样。那是因为它是将字符串视为代码:
\n\neval并且只需运行该代码即可。这就是为什么你不想在这里使用它。"__import__(\'os\').system(\'mr -rf /\')"一个拼写错误,而不是一个真正糟糕的评估主意。1. 它还可以评估已编译的代码对象,这就是为什么错误消息比您预期的要复杂一些,但不用担心。
\n