[英]sympy: post order traversal over expression tree: skips top-level operation
我正在嘗試通過 sympy 表達式循環發布訂單。 它工作正常,除了它跳過了最后一次添加(在我的示例中添加了sympy.sin(x * y)
和z**2
)。
import sympy
def post(expr):
if not expr:
return
for arg in expr.args:
post(arg)
print(f'arg {arg}')
print(f'arg.func: {arg.func}')
print(f'arg.args: {arg.args}')
x, y, z = sympy.symbols('x,y,z')
expr = sympy.sin(x * y) + z**2
post(expr)
我認為這是因為for arg in expr.args
但如果我.args
並遍歷整個表達式
import sympy
def post(expr):
if not expr:
return
for arg in expr:
post(arg)
print(f'arg {arg}')
print(f'arg.func: {arg.func}')
print(f'arg.args: {arg.args}')
x, y, z = sympy.symbols('x,y,z')
expr = sympy.sin(x * y) + z**2
post(expr)
我得到TypeError: 'Add' object is not iterable
。 我能以某種方式解決這個問題,使其遍歷表達式的所有函數並且不跳過頂級 function 嗎?
如果您想使用此電池,則已包含在內:
from sympy.core.traversal import postorder_traversal
for i in postorder_traversal(expr):print(i)
給
z
2
z**2
x
y
x*y
sin(x*y)
z**2 + sin(x*y)
否則,請考慮對您的 function 進行此修改:
def post(expr):
for arg in expr.args:
post(arg)
print(f'arg {expr}')
print(f'arg.func: {expr.func}')
print(f'arg.args: {expr.args}')
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.