官术网_书友最值得收藏!

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__()原理是一樣的。

主站蜘蛛池模板: 贵德县| 从江县| 黄梅县| 会东县| 岳普湖县| 武强县| 会同县| 习水县| 梁平县| 金川县| 子洲县| 若羌县| 凤阳县| 昌邑市| 苏尼特右旗| 金寨县| 瓦房店市| 库伦旗| 英山县| 望都县| 科技| 晴隆县| 汤原县| 静宁县| 濮阳县| 宁夏| 潞城市| 玛沁县| 社会| 承德市| 福清市| 安仁县| 西吉县| 孟村| 滨海县| 巫溪县| 尖扎县| 和政县| 新沂市| 上思县| 武安市|