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) (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |