pythoncookbook深入挖掘------------访问者模式

本文探讨如何使用访问者模式处理复杂数据结构,例如遍历具有多种节点类型的树形结构。通过数学表达式求值的例子,展示了递归和非递归(利用生成器)的实现方式,加深了对访问者模式和生成器的理解。同时,通过递归和非递归方法实现了多叉树的前序和后序遍历,以巩固这一概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题
你要处理由大量不同类型的对象组成的复杂数据结构,每一个对象都需要需要进行不同的处理。 比如,遍历一个树形结构,然后根据每个节点的相应状态执行不同的操作。


解决方案
这里遇到的问题在编程领域中是很普遍的,有时候会构建一个由大量不同对象组成的数据结构。 假设你要写一个表示数学表达式的程序,那么你可能需要定义如下的类:


关于访问者模式<<pythoncookbook>>里举了数学表达式的例子,并用递归和非递归两种方式实现了求值。

其中用生成器(yield)实现非递归非常巧妙,也对生成器的理解更深了。


为了加强理解,同样用递归和非递归2种方式实际了多叉树的前序和后序遍历,代码如下:


__author__ = 'zhangxa'

import types

class Node:
    pass

class Branch(Node):
    def __init__(self,children):
        assert children is not None and isinstance(children,list)
        self.children = children

    def __str__(self):
        branch_str = 'Branch['
        for child in self.children:
            branch_str += str(child)
        bra
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

self-motivation

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值