我是Python对象的新手,并且有很多问题.我需要将一个函数传递给我的对象,然后评估该函数.代码类似于:
from sympy import var
class eval:
def __init__(self, M):
self.M = M
def fun(self, x):
M = self.M
print M(x)
x = var('x')
ak = eval(x+2)
ak.fun(x)
Run Code Online (Sandbox Code Playgroud)
这是错误:
TypeError
Traceback (most recent call last)
(ipython-input-1-b7ef311bd1f0> in <module)()
12
13 ak = eval(x+2)
---> 14 ak.fun(x)
(ipython-input-1-b7ef311bd1f0) in fun(self, x)
7 def fun(self, x):
8 M = self.M
----> 9 print M(x)
10
11 x = var('x')
TypeError: 'Add' object is not callable
Run Code Online (Sandbox Code Playgroud)
Kra*_*nov 10
我是Python对象的新手......
有问题很好,但SymPy背后的对象和类非常复杂,并且在深入研究这样一个库之前学习Python对象模型的基础知识是强烈鼓励的.
建议的代码存在许多问题:
eval 是内置的,所以覆盖它是不好的风格 SymPy 没有提供创建python函数的新语法.尤其(x+2)(4)是不打算给你6.如果你想要这只是在myfun = lambda _: _+2; fun(4)不使用SymPy的情况下编写.
x+2是一个SymPy对象(Add(Symbol('x')+Integer(2))),而不是一些python AST.你可以用x其他东西代替,(x+2).subs(x,y)但你不能指望图书馆神奇地知道你在Symbol('x')写作时有一些特别的东西(x+2)(4).你也可以写blah = Symbol('random_string'); (blah+2)(4).
var是一个用于创建Symbol对象的辅助函数,但它用于在解释器中进行交互式使用.不要在库代码中使用它,因为作为副作用,它会在命名空间中注入全局变量.只是用Symbol('x').
x+2可赎回在0.7.2中实现了递归调用.这意味着您可以创建Expr包含未评估的符号对象的SymPy 树,并将整个树应用于另一个对象,调用向内传播,直到所有未评估的对象都被替换为已评估的对象.我想上面的描述并不清楚,所以这里有一个例子:
您想要创建一个D可以执行以下操作的差分运算符对象:
>>> op = g(y)*D # where g is Function and y is Symbol
>>> op(f(x))
g(y)*f(x).diff(x)
Run Code Online (Sandbox Code Playgroud)
这种方法的工作方式是沿着树(Mul(g(y), D)在这种情况下),跳过评估的符号对象并评估未评估的符号对象.
因为很多SymPy的用户在阅读数据模型之前就开始使用它,这引起了很多混乱,所以我们将递归调用方案移到了rc方法中.在0.7.3 (x+2)(4)中将再次引发错误.
| 归档时间: |
|
| 查看次数: |
6521 次 |
| 最近记录: |