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

