簡體   English   中英

sympy:表達式樹的后序遍歷:跳過頂級操作

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM