【发布时间】:2017-08-21 14:49:22
【问题描述】:
这个问题是上一个问题pass class method to fsolve的后续问题。
@jim 在关于函数对象名称和函数调用之间差异的问题中的回答澄清了我的困惑并解决了问题。但是,当我在 sympy 中尝试类似的事情时:
from sympy.solvers import solve
from sympy import Symbol
class Demo():
def __init__(self, var):
self.i = var
def func(self):
return self.i ** 2 - 4
x = Symbol('x')
def func(v):
return v ** 2 - 4
new = Demo(x)
solve(new.func(), x) # This works fine, even as a function call
solve(func(x), x) # This works fine, even as a function call
为什么会有不同的结果? (在 scipy 中我需要将函数名传递给求解器,而在 sympy 中我需要传递函数调用。)是因为这两个库的实现不同吗?在上面的例子中,如果我用函数名替换函数调用,就会引发异常:
File "<ipython-input-26-3554c1f86646>", line 13, in <module>
solve(new.func, x)
File "Anaconda3\lib\site-packages\sympy\solvers\solvers.py", line 817, in solve
f, symbols = (_sympified_list(w) for w in [f, symbols])
File "Anaconda3\lib\site-packages\sympy\solvers\solvers.py", line 817, in <genexpr>
f, symbols = (_sympified_list(w) for w in [f, symbols])
File "Anaconda3\lib\site-packages\sympy\solvers\solvers.py", line 808, in _sympified_list
return list(map(sympify, w if iterable(w) else [w]))
File "Anaconda3\lib\site-packages\sympy\core\sympify.py", line 324, in sympify
raise SympifyError('could not parse %r' % a, exc)
SympifyError: Sympify of expression 'could not parse '<bound method Demo.func of <__main__.Demo object at 0x0000018A37DA6518>>'' failed, because of exception being raised:
SyntaxError: invalid syntax (<string>, line 1)
【问题讨论】:
-
你没有传递函数名...你传递函数返回值是因为你调用了函数
-
@cricket_007 似乎我错过了关于函数的非常基本的知识......请查看我自己的答案,如果我做对了,请告诉我。
-
看起来不错。是的
标签: python python-3.x scipy sympy