zoukankan      html  css  js  c++  java
  • Python之实现迭代器协议

    什么是迭代器:

    --迭代器(迭代就是循环)

    可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator

    可迭代对象有:

    一类是集合数据类型,如list,tuple,dict,set,str等

    一类是generator,包括生成器和带yield的generator function

    这些可以直接作用于for 循环的对象统称为可迭代对象:Iterable

    但是必须可以被next() 函数调用并不断返回下一个值! 的  可迭代对象,才是迭代器

    实现迭代器协议:

    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 c in self:
                yield from c.depth_first()
    
    
    root = Node(0)
    child1 = Node(1)
    child2 = Node(2)
    root.add_child(child1)
    root.add_child(child2)
    
    grandson1=Node(3)
    grandson2=Node(4)
    grandson3=Node(5)
    child1.add_child(grandson1)
    child1.add_child(grandson2)
    child2.add_child(grandson3)
    
    
    
    for ch in root.depth_first():
        print(ch)
    # 代码我理解的是意思是:root 是爷爷,他孩子是child1,child2,然后child1又有两个孩子Node(3),Node(4),child2只有一个孩子Node(5);
    # 祖孙三代都是Node()对象
    # Node(0)
    # Node(1)
    # Node(3)
    # Node(4)
    # Node(2)
    # Node(5)
    # depth_first()方法很重要,它首先返回自己本身并迭代每一个子节点并 通过调用子节点的 depth_first() 方法(使用 yield from 语句)返回对应元素。

    yeild  和yeild from 区别

    # 字符串
    astr='ABC'
    # 列表
    alist=[1,2,3]
    # 字典
    adict={"name":"wangbm","age":18}
    # 生成器
    agen=(i for i in range(4,8))
    
    def gen(*args, **kw):
        for item in args:
            for i in item:
                yield i
    
    new_list=gen(astr, alist, adict,agen)
    print(list(new_list))
    # ['A', 'B', 'C', 1, 2, 3, 'name', 'age', 4, 5, 6, 7]
    
    
    # 字符串
    astr='ABC'
    # 列表
    alist=[1,2,3]
    # 字典
    adict={"name":"wangbm","age":18}
    # 生成器
    agen=(i for i in range(4,8))
    
    
    def gen(*args, **kw):
        for item in args:
            yield from item
    
    
    new_list=gen(astr, alist, adict, agen)
    print(list(new_list))
    # ['A', 'B', 'C', 1, 2, 3, 'name', 'age', 4, 5, 6, 7]
    
    # 由上面两种方式对比,可以看出,yield from后面加上可迭代对象,他可以把可迭代对象里的每个元素一个一个的yield出来,对比yield来说代码更加简洁,结构更加清晰
  • 相关阅读:
    P2617 Dynamic Rankings 动态主席树
    P4338 [ZJOI2018]历史 LCT+树形DP
    P3348 [ZJOI2016]大森林
    P3613 睡觉困难综合征 LCT+贪心+位运算
    SP16549 QTREE6
    P3703 [SDOI2017]树点涂色 LCT维护颜色+线段树维护dfs序+倍增LCA
    U19464 山村游历(Wander) LCT维护子树大小
    P4219 [BJOI2014]大融合 LCT维护子树大小
    P2542 [AHOI2005]航线规划 LCT维护双连通分量
    P3950 部落冲突
  • 原文地址:https://www.cnblogs.com/zzy-9318/p/10491225.html
Copyright © 2011-2022 走看看