zoukankan      html  css  js  c++  java
  • yield from

    yield from

    先说说3个东西,可迭代iterable,迭代器iterator,生成器generator,3者关系层层递进。

    iterable : _iter_ (支持for循环)

    iterator : _iter_ __next__ (支持for循环、next)

    generator : _iter_ __next__ yield (支持for循环、next、yield)

    关于yield, 激活主要有两个方法

    • 使用next()
    • 使用generator.send(None)

    对于yield from

    yield from 后面需要加的是可迭代对象,它可以是普通的可迭代对象,也可以是迭代器,甚至是生成器。

    当然实现生成器的嵌套,并不是一定必须要使用yield from,而是使用yield from可以让我们避免让我们自己处理各种料想不到的异常,而让我们专注于业务代码的实现。

    1、调用方:调用委派生成器的客户端(调用方)代码
    2、委托生成器:包含yield from表达式的生成器函数
    3、子生成器:yield from后面加的生成器函数

    # 子生成器
    def average_gen():
        total = 0
        count = 0
        average = 0
        while True:
            new_num = yield average
            if new_num is None:
                break
            count += 1
            total += new_num
            average = total/count
    
        # 每一次return,都意味着当前协程结束。
        return total,count,average
    
    # 委托生成器
    def proxy_gen():
        while True:
            # 只有子生成器要结束(return)了,yield from左边的变量才会被赋值,后面的代码才会执行。
            total, count, average = yield from average_gen()
            print("计算完毕!!
    总共传入 {} 个数值, 总和:{},平均数:{}".format(count, total, average))
    
    # 调用方
    def main():
        calc_average = proxy_gen()
        next(calc_average)            # 预激协程
        print(calc_average.send(10))  # 打印:10.0
        print(calc_average.send(20))  # 打印:15.0
        print(calc_average.send(30))  # 打印:20.0
        calc_average.send(None)      # 结束协程
        # 如果此处再调用calc_average.send(10),由于上一协程已经结束,将重开一协程
    
    if __name__ == '__main__':
        main()
    

    参考: https://www.cnblogs.com/wongbingming/p/9060989.html

    https://www.cnblogs.com/wongbingming/p/9085268.html

  • 相关阅读:
    八卦——朋友的老公有外遇
    吃,玩——幸福的上海一天
    婚礼——金茂群楼豪华婚礼
    吃狂吃大喜九
    玩——苏州粗体验
    XCF之原形
    快速类型判定
    ReaderWriterLockSlim使用注意事项
    WCF服务端基于配置的实现——路由
    Opera使用心得
  • 原文地址:https://www.cnblogs.com/friedCoder/p/12721509.html
Copyright © 2011-2022 走看看