python进阶——生成器系列之代理迭代

花间影清欢课程 2024-11-21 02:36:14
一、面试问题如果有一个自定义容器对象,其中包含了各种可迭代对象,如文件对象,元组等等,此时如何进行迭代操作呢? 二、处理方案因为是自定义容器对象内部包含可迭代对象,因此不能简单地只对外层容器对象进行迭代操作,而应该将迭代操作代理到容器内部的对象上。比如: class Node: def __init__(self, _value): self.value = _value self.children = [] def __repr__(self): return f'Node({slef.value})' def add_child(self, node): self.children.append(node) def __iter__(self): return iter(self.children)if __name__ == '__main__': root = Node(0) child1 = Node(1) child2 = Node(2) root.add_child(child1) root.add_child(child2) for ch in root: print(ch)在上面代码中,使用__iter__()方法方便的将迭代请求传递给内部的children属性。 三、总结python 的迭代器协议需要__iter__()方法返回一个实现了__next__()方法的迭代器对象。如果只是迭代遍历其他容器的内容,则无须担心底层实现细节。 上例中的iter()函数简化了代码,iter(s)相当于通过调用s__iter__()方法来返回对应的迭代对象。
0 阅读:0