
[Python][迭代器和生成器] 迭代协议
节点的初始化:接受节点的值,并初始化一个空的孩子列表。 节点的添加子节点:通过 深度优先遍历:通过 创建根节点 rooted,并初始化其子节点。 逐步添加节点,确保树的结构正确。 调用`root.depth_first()`并遍历结果计算输出。 创建一个 初始化时,传入起始节点“start_node”。 实现`iter()``方法返回自身。 实现`next()``方法,配合当前节点的迭代器来处理输出。
发布日期:2021-05-28 16:50:28
浏览次数:36
分类:精选文章
本文共 2059 字,大约阅读时间需要 6 分钟。
深度优先生成器实现
Node类的定义与实现
在本节中,我们将定义一个Node
类,该类用于表示树形结构中的节点,并实现深度优先遍历的生成器功能。Node
类的主要功能包括:
add_child
方法将子节点添加到当前节点的孩子列表中。depth_first
方法实现深度优先遍历,返回一个生成器。代码实现
class Node: def __init__(self, value): self._value = value self._children = [] def __repr__(self): return 'Node({!r})'.format(self._value) def add_child(self, node): self._children.append(node) def __iter__(self): return iter(self._children) def depth_first(self): yield self for child in self: yield from child.depth_first()
深度优先遍历的测试与验证
为了验证depth_first
方法的实现是否正确,我们可以通过以下步骤进行测试:
树的结构示例
假设树的结构如下:
root├─ child1│ ├─ child3│ └─ child4├─ child2│ └─ child5
测试代码
root = Node(0)child1 = Node(1)child2 = Node(2)root.add_child(child1)root.add_child(child2)child1.add_child(Node(3))child1.add_child(Node(4))child2.add_child(Node(5))for ch in root.depth_first(): print(ch)
普通深度优先实现的比较
相比自定义生成器方法,传统的深度优先遍历实现往往需要引入额外的迭代器对象。其典型实现思路如下:
DepthFisrtIterator
类,继承自object
。具体实现代码
class DepthFisrtIterator(object): def __init__(self, start_node): self._node = start_node self._children_iter = None self._child_iter = None def __iter__(self): return self def __next__(self): if self._children_iter is None: self._children_iter = iter(self._node) return self._node elif self._child_iter: try: nextchild = next(self._children_iter) return nextchild except StopIteration: self._child_iter = None return next(self) else: self._children_iter = next(self._children_iter).depth_first() return next(self)
总结
通过上述实现,可以清楚地看到深度优先生成器的两种不同实现方式。自定义生成器方法更为简洁高效,充分利用了Python的生成器特性,而传统的迭代器方法则通过组合多个迭代器来实现深度优先遍历。选择哪一种方式取决于具体的性能需求和实现场景。在实际应用中,推荐采用生成器方法,因其代码简洁且易于扩展。
发表评论
最新留言
做的很好,不错不错
[***.243.131.199]2025年04月15日 02时57分06秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
block多队列分析 - 2. block多队列的初始化
2019-03-09
Java时间
2019-03-09
不编译只打包system或者vendor image命令
2019-03-09
【编程】C语言入门:1到 100 的所有整数中出现多少个数字9
2019-03-09
flink启动(二)
2019-03-09
pair的用法
2019-03-09
Flex 布局的自适应子项内容过长导致其被撑大问题
2019-03-09
PL/SQL 动态Sql拼接where条件
2019-03-09
Lua-table 一种更少访问的安全取值方式
2019-03-09
虚函数
2019-03-09
【自学Flutter】4.1 Material Design字体图标的使用(icon)
2019-03-09
【换行符】什么时候用cin.get()吃掉输入流中的换行符
2019-03-09
【二叉树】已知后序与中序求先序
2019-03-09
广东外语外贸大学第三届网络安全大赛Writeup
2019-03-09
SpringBoot使用RedisTemplate简单操作Redis的五种数据类型
2019-03-10
Thymeleaf sec:authorize 标签不生效
2019-03-11
微信JS-SDK DEMO页面和示例代码
2019-03-11
一张图搞定RPC框架核心原理
2019-03-11
他来了他来了,他带着云栖大会的免费门票走来了
2019-03-11