使用生成器 --实现迭代协议

目前来看,要在对象上实现可迭代功能,最简单的方式就是使用生成器函数。

使用示例:使用生成器函数,实现一个迭代器能够以深度优先的模式遍历树的节点

class Node:
    def __init__(self, value):
        self._value = value
        self._children = []

    def __repr__(self):
        return 'Node({!r})'.format(self._value)

    def add_children(self, node):
        self._children.append(node)

    def __iter__(self):
        return iter(self._children)

    def depth_first(self):
        """
        1、首先产生出自身
        2、然后迭代每个子节点,利用子节点的depth_first()方法(通过yield from 语句)产生出其他元素
        """
        yield self
        for c in self:
            yield from c.depth_first()

root = Node(0)
child1 = Node(1)
child2 = Node(2)
root.add_children(child1)
root.add_children(child2)
child1.add_children(Node(3))
child1.add_children(Node(4))
child2.add_children(Node(5))

for ch in root.depth_first():
    print(ch)  # 深度优先
Outs:    
Node(0)
Node(1)
Node(3)
Node(4)
Node(2)
Node(5)

关于Node类:
1、Node类本身就是一个迭代器,以委托迭代的方式实现;
2、类里面的depth_first()方法,使用生成器函数实现了以深度优先的模式遍历树节点的迭代器。

总结:

1、Python的迭代协议要求__iter__()返回一个特殊的迭代器对象,该对象必须实现__next__()方法,并使用StopIteration异常来通知迭代完成;
2、把迭代器以生成器的形式来定义,以此实现迭代协议非常高效。

你可能感兴趣的:(使用生成器 --实现迭代协议)