zoukankan      html  css  js  c++  java
  • python中和生成器协程相关yield from之最详最强解释,一看就懂(二)

    一. 从列表中yield 

    语法形式:yield from <可迭代的对象实例>

    python中的列表是可迭代的, 如果想构造一个生成器逐一产生list中元素,按之前的yield语法,是在生成器内部遍历该list,每一轮用yiled依次产生一个生成的值。

    def generator():
        for i in range(5):
            yield i
    return 'done'

    采用yiled from语法,可以这样写, 每一个元素均用yield生成一个值, 是不是更简单 !

    def generator():
        yield from range(5)
    return 'done'

    二. 使用子生成器 

    语法形式:yield from <子生成器>

    生成器永远是一个迭代器,所以也可迭代的对象,因此 yield from后面可以直接跟生成器,比如下面的proxgen, 将直接根据subgen的生成值逐一产生一个同样的生成值

    subgen = generator()
    def proxygen(): yield from subgen:

    三. 获取子生成器返回值

    语法形式:rt = yield from 子生成器

    subgen = generator()
    def proxygen(): t = yield from subgen: 
    print(t)

    这里需要特别注意的是, 在子生成器subgen未执行完成(也就是没有自然终结或者return返回)之前,yield from前面的赋值语句是不会被执行的,只有子生成器全部执行完成后,此时subgen通过return返回的值就是yield from subgen的返回值'done',这个变量t才真正被赋值为'done'. 完整代码如下:

    def generator():
        yield from range(5)
        return 'done'
        
    def proxygen():
        t = yield from generator()
        print(t)
    
    for i in proxygen():
        print(i)

    输出如下:

    0
    1
    2
    3
    4
    done

    可以看到,在proxygen中打印的'done',直到所有值都生成并打印完成后,最后才输出。

    四. yield from的真正意义 

    如果只是简单的语法糖式化简,3.3版本后专门搞个新的yield from语法关键字, 似乎有点小题大作。yield from的真正意义非常牛逼,看下回分解

    下一篇 : python中和生成器协程相关的yield from之最详最强解释,一看就懂(三)

    上一篇:  python中和生成器协程相关的yield之最详最强解释,一看就懂(一)

  • 相关阅读:
    SCU 3133(博弈)
    SCU 3132(博弈)
    hdu 5183(hash)
    hdu3329(2次dfs)
    hdu5179(数位dp)
    zoj2314(有上下界的网络流)
    CF 519E(树上倍增求lca)
    hdu1251(Trie树)
    SCU 2009(数位dp)
    【Leetcode】Letter Combinations of a Phone Number
  • 原文地址:https://www.cnblogs.com/chry/p/10701815.html
Copyright © 2011-2022 走看看