- Python進階編程:編寫更高效、優雅的Python代碼
- 劉宇宙 謝東 劉艷
- 305字
- 2021-04-30 12:39:48
4.1.2 代理迭代
自定義一個容器對象,其中包含列表、元組或其他可迭代對象。現在,我們直接在該自定義容器對象上執行迭代操作。
我們先定義一個__iter__()方法,將迭代操作代理到容器內部的對象上,代碼(proxy_iter_exp.py)如下:
class Node: def __init__(self, value): self._value = value self._children = [] def __repr__(self): return f'Node({self._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(f'child is:{ch}')
執行py文件,輸出結果如下:
child is:Node(1) child is:Node(2)
在上述示例代碼中,__iter__()方法只是簡單地將迭代請求傳遞給內部的_children屬性。
Python的迭代器協議需要__iter__()方法返回一個實現__next__()方法的迭代器對象。如果只是迭代遍歷其他容器的內容,無須擔心底層是怎樣實現的,只需傳遞迭代請求即可。
這里iter()函數的使用簡化了代碼,iter(s)只是簡單地通過調用s.__iter__()方法來返回對應的迭代器對象,與len(s)調用s.__len__()原理是一樣的。
推薦閱讀
- Mastering NetBeans
- 高效微控制器C語言編程
- 小創客玩轉圖形化編程
- PHP程序設計(慕課版)
- JavaFX Essentials
- The Data Visualization Workshop
- 深入剖析Java虛擬機:源碼剖析與實例詳解(基礎卷)
- Spring 5 Design Patterns
- JavaScript程序設計:基礎·PHP·XML
- Python 3 Object:oriented Programming(Second Edition)
- Backbone.js Testing
- 貫通Tomcat開發
- Java語言程序設計實用教程(第2版)
- Kotlin語言實例精解
- Java編程指南:語法基礎、面向對象、函數式編程與項目實戰