一. 从列表中yield html
语法形式:yield from <可迭代的对象实例>python
python中的列表是可迭代的, 若是想构造一个生成器逐一产生list中元素,按以前的yield语法,是在生成器内部遍历该list,每一轮用yiled依次产生一个生成的值。spa
def generator(): for i in range(5): yield i
return 'done'
采用yiled from语法,能够这样写, 每个元素均用yield生成一个值, 是否是更简单 !code
def generator(): yield from range(5)
return 'done'
二. 使用子生成器 协程
语法形式:yield from <子生成器>htm
生成器永远是一个迭代器,因此也可迭代的对象,所以 yield from后面能够直接跟生成器,好比下面的proxgen, 将直接根据subgen的生成值逐一产生一个一样的生成值对象
subgen = generator()
def proxygen(): yield from subgen:
三. 获取子生成器返回值blog
语法形式:rt = yield from 子生成器get
subgen = generator()
def proxygen(): t = yield from subgen:
print(t)
这里须要特别注意的是, 在子生成器subgen未执行完成(也就是没有天然终结或者return返回)以前,yield from前面的赋值语句是不会被执行的,只有子生成器所有执行完成后,此时subgen经过return返回的值就是yield from subgen的返回值'done',这个变量t才真正被赋值为'done'. 完整代码以下:generator
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的真正意义很是牛逼,看下回分解