目前来看,要在对象上实现可迭代功能,最简单的方式就是使用生成器函数。
使用示例:使用生成器函数,实现一个迭代器能够以深度优先的模式遍历树的节点
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、把迭代器以生成器的形式来定义,以此实现迭代协议非常高效。