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

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

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

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、把迭代器以生成器的形式来定义,以此实现迭代协议非常高效。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值