Understanding Expression Trees
>>> from sympy import * >>> x, y, z = symbols('x y z') >>> expr = x**2 + x*y >>> srepr(expr) #使用srepr查看內部保存形式 Add(Pow(Symbol('x'), Integer(2)), Mul(Symbol('x'), Symbol('y')))
#symbols是類Symbol的實例 >>> x = symbols('x') >>> x = Symbol('x')
#指數在內部用Pow函數表示 >>> srepr(x**2) Pow(Symbol('x'), Integer(2)) >>> Pow(x, 2) 2**x
#乘積在內部用Mul函數表示 >>> srepr(x*y) Mul(Symbol('x'), Symbol('y')) >>> Mul(x, y) x⋅y
#相加在內部用Add函數表示 >>> Add(Pow(x, 2), Mul(x, y)) x**2 + x*y
#一個比較複雜的例子 >>> expr = sin(x*y)/2 - x**2 + 1/y >>> srepr(expr) Add(Mul(Integer(-1), Pow(Symbol('x'), Integer(2))), Mul(Rational(1, 2), sin(Mu l(Symbol('x'), Symbol('y')))), Pow(Symbol('y'), Integer(-1)))
#減號在內部被譯成加相反數 >>> srepr(x - y) Add(Symbol('x'), Mul(Integer(-1), Symbol('y')))
#除號在內部被譯成乘被除數的倒數 >>> expr = x/y >>> srepr(expr) Mul(Symbol('x'), Pow(Symbol('y'), Integer(-1)))
#內部表達是無序的 >>> 1 + x x + 1
#func用於獲取頂部節點 >>> expr = Add(x, x) >>> expr.func #此處爲Mul,不是Add <class 'sympy.core.mul.Mul'> >>> expr #在內部被自動轉換成乘了 2⋅x
#一些特殊的類型 >>> Integer(2).func <class 'sympy.core.numbers.Integer'> >>> Integer(0).func <class 'sympy.core.numbers.Zero'> >>> Integer(-1).func <class 'sympy.core.numbers.NegativeOne'> #下面兩個都是Integer的子類,所以isinstance可用
#args獲取頂層元素 >>> expr = 3*y**2*x >>> expr.func <class 'sympy.core.mul.Mul'> >>> expr.args (3, x, y**2) >>> srepr(expr) Mul(Integer(3), Symbol('x'), Pow(Symbol('y'), Integer(2)))
#expr.func的頂層爲Mul函數,用*將頂層數據解析作爲參數,巧妙 >>> expr.func(*expr.args) 3*x*y**2 >>> expr == expr.func(*expr.args) True #args的結果是排序了的,而且可以進一步解析 >>> expr.args[2].args (y, 2)
#定義函數,將表達式前序解析 >>> def pre(expr): ... print(expr) ... for arg in expr.args: ... pre(arg) >>> expr = x*y + 1 >>> pre(expr) x*y + 1 1 x*y x y #調用內部函數解析 >>> for arg in preorder_traversal(expr): ... print(arg) x*y + 1 1 x*y x y