加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

pythoncookbook深入发掘------------会见者模式

发布时间:2021-01-16 15:32:42 所属栏目:大数据 来源:网络整理
导读:题目 你要处理赏罚由大量差异范例的工具构成的伟大数据布局,每一个工具都必要必要举办差异的处理赏罚。 好比,遍历一个树形布局,然后按照每个节点的响应状态执行差异的操纵。 办理方案 这里碰着的题目在编程规模中是很广泛的,偶然辰会构建一个由大量差异工具构成

题目
你要处理赏罚由大量差异范例的工具构成的伟大数据布局,每一个工具都必要必要举办差异的处理赏罚。 好比,遍历一个树形布局,然后按照每个节点的响应状态执行差异的操纵。


办理方案
这里碰着的题目在编程规模中是很广泛的,偶然辰会构建一个由大量差异工具构成的数据布局。 假设你要写一个暗示数学表达式的措施,那么你也许必要界说如下的类:


关于会见者模式<<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)
        branch_str += ']'
        return branch_str

class Leaf(Node):
    def __init__(self,value):
        self.value = value

    def __str__(self):
        return 'Leaf[%s]'%self.value

class Visitor:
    def visit(self,node):
        methname = 'visit_' + type(node).__name__
        meth = getattr(self,methname,None)
        if meth is None:
            meth = self.generic_visit
        return meth(node)

    def generic_visit(self,node):
        raise RuntimeError('No {} method'.format('visit_' + type(node).__name__))

class PreTreeVisitor(Visitor):
    def visit_Branch(self,node):
        print(node)
        for child in node.children:
            self.visit(child)

    def visit_Leaf(self,node):
        print(node)

class AfterTreeVisitor(Visitor):
    def visit_Branch(self,node):
        for child in node.children:
            self.visit(child)
        print(node)

    def visit_Leaf(self,node):
        print(node)

class GenTreeVisitor(Visitor):
    def gen_visit(self,node):
        stack = [node]
        last_result = None
        print('------%s------'%self.__class__)
        while stack:
            try:
                last = stack[-1]
                if isinstance(last,types.GeneratorType):
                    stack.append(last.send(last_result))
                    last_result = None
                elif isinstance(last,Node):
                    stack.append(self.visit(stack.pop()))
                else:
                    print(stack.pop())
            except StopIteration:
                stack.pop()


class GeneratorAfterTreeVisitor(GenTreeVisitor):
    def visit_Branch(self,node):
        for child in node.children:
            yield child
        yield str(node)

    def visit_Leaf(self,node):
        yield str(node)


class GeneratorPreTreeVisitor(GenTreeVisitor):
    def visit_Branch(self,node):
        yield str(node)
        for child in node.children:
            yield child


    def visit_Leaf(self,node):
        yield str(node)


if __name__ == "__main__":
    t1 = Leaf(1)
    t2 = Leaf(2)
    t3 = Leaf(3)
    t4 = Branch([t1,t2,t3])

    t5 = Leaf(4)
    t6 = Leaf(5)
    t7 = Leaf(6)
    t8 = Branch([t6,t7])
    t9 = Branch([t5,t8])
    t10 = Branch([t4,t9])

    print('------after traverse------')
    tv = AfterTreeVisitor()
    tv.visit(t10)

    print('------pre traverse------')
    tv = PreTreeVisitor()
    tv.visit(t10)

    tv = GeneratorAfterTreeVisitor()
    tv.gen_visit(t10)

    tv = GeneratorPreTreeVisitor()
    tv.gen_visit(t10)

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读