使用生成器 --實現迭代協議
目前來看,要在物件上實現可迭代功能,最簡單的方式就是使用生成器函式。
使用示例:使用生成器函式,實現一個迭代器能夠以深度優先的模式遍歷樹的節點
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、把迭代器以生成器的形式來定義,以此實現迭代協議非常高效。
相關文章
- 迭代協議與生成器 101協議
- 從迭代器模式到迭代協議模式協議
- ES6系列--7. 可迭代協議和迭代器協議協議
- 協議生成器工具協議
- ES6 迭代協議協議
- 教你如何使用Zig實現Cmpp協議協議
- 使用netty實現socks5協議Netty協議
- 實現 Raft 協議Raft協議
- Python學習之迭代器協議Python協議
- QT使用 http 協議通訊的實現示例QTHTTP協議
- 使用leancloud實現迭代查詢Cloud
- 可迭代物件、迭代器、生成器物件
- 如何使用Jmeter實現WebSocket協議的介面測試JMeterWeb協議
- 迭代器、生成器
- 迭代器,生成器
- py 迭代生成器
- PPM協議的輸出實現協議
- STOMP協議——基於Websocket實現協議Web
- Python之可迭代物件、迭代器、生成器Python物件
- 迭代器與生成器
- 迭代器和生成器
- python 生成器&迭代器Python
- Python使用socket的UDP協議實現FTP檔案服務PythonUDP協議FTP
- 使用GO實現Paxos分散式一致性協議Go分散式協議
- 使用go net實現簡單的redis通訊協議YWSVGoRedis協議
- 教你用Perl實現Smgp協議協議
- Go語言實現HTTPS加密協議GoHTTP加密協議
- 使用ensp搭建路由拓撲,並使用ospf協議實現網路互通實操路由協議
- 使用ensp搭建路由拓撲,並使用isis協議實現網路互通實操路由協議
- 生成器函式,迭代器函式
- Python迭代器與生成器Python
- QQ 快速登入協議分析與實現協議
- 用python實現TCP協議傳輸功能PythonTCP協議
- consul 原始碼解析(一)raft 協議實現原始碼Raft協議
- 通訊協議protobuf的原理與實現協議
- RxJS的另外四種實現方式(五)——使用生成器實現JS
- Cisco發現協議協議
- 實用TCP協議(1):TCP 協議簡介TCP協議