我正在编写一个深度优先遍历函数,想要实现以下功能:
def traverse(node):
yield node
for n in node.children:
yield_all traverse(n) # << if Python had a yield_all statement
这里需要将树中的节点转化为一个(扁平化的)序列。 方法一:(传播yield)
def traverse(node):
yield node
for n in node.children:
for m in traverse(n):
yield m
方法二:(序列展平)
def traverse(node):
return itertools.chain([node],*(traverse(n) for n in node.children))
第一种方法看起来更简洁,但是在每个层级显式地
yield
每个子树中的节点感觉有些奇怪。第二种方法简洁而略显凌乱,但它与我在Haskell中编写的方式相匹配:
traverse node = node : concatMap traverse (children node)
所以我的问题是:哪个更好?或者我错过了第三个最佳选项吗?