美文网首页Python
使用生成器 --实现迭代协议

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

作者: cook__ | 来源:发表于2018-10-03 12:53 被阅读9次

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

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

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

相关文章

  • python の 可迭代、迭代器 、生成器

    生成器: 生成器是一种特殊的迭代器,生成器自动实现了“迭代器协议”(即__ iter__和__ next __方法...

  • JavaScript设计模式-0001---迭代器模式

    使用闭包实现迭代器 test es6使用 生成器实完成迭代器模式 使用es6的生成器实现数据自增 迭代器/es6的...

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

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

  • 迭代器和生成器

    1. 迭代器协议 由于生成器自动实现了迭代器协议,而迭代器协议对很多人来说,也是一个较为抽象的概念。所以,为了更好...

  • python 生成器小结

    作者:邵正将 来源:PytLab 在python中生成器可以很方便的实现迭代协议。生成器通过生成器函数产生,生成器...

  • 使用迭代器和生成器实现斐波拉契数列

    一、使用迭代器实现斐波拉契数列 二、使用生成器 使用迭代器和生成器的好处是节省内存、惰性求值

  • 对象迭代与反迭代案例进阶

    案例课纲如下 如何实现可迭代对象和迭代器对象 如何使用生成器函数实现可迭代对象 如何进行反向迭代以及如何实现反向迭...

  • 迭代器生成器、模块和包

    回顾: 列表推导式 2.生成器generator在Python中,使用生成器可以很方便的支持迭代器协议。在 Pyt...

  • PHP生成器

    Generators 生成器提供了一种容易的方法来实现简单的迭代器 生成器允许您编写使用foreach的代码迭代一...

  • Python高效编程(二)

    实际编程和面试都会遇到的典型问题。 如何实现可迭代对象和迭代器对象 如何使用生成器函数实现可迭代对象 如何进行反向...

网友评论

    本文标题:使用生成器 --实现迭代协议

    本文链接:https://www.haomeiwen.com/subject/bipzoftx.html