chapter4.6生成器
生成器generator
生成器是指生成器对象,可以使用生成器表达式,也可以使用yield关键字得到生成器函数,调用一次得到一个对象
生成器函数
函数体中包含yield语句函数返回生成器对象
是一个迭代器,是可迭代对象
惰性求值,延迟计算
生成器对象迭代完不能回头,调用使用next
没有多余的 yield可以执行,迭代完成后再迭代会抛出StopIteration异常
yield语句在函数中,函数就是生成器,,调用不会立即执行
执行到yield会暂停,把yield表达式返回
return 可以终止函数运行,但是返回值不会获取到,会与异常一同抛出
next(generation)会从当前位置向后执行到碰到的第一个yield语句,会弹出值,并暂停
可以用来构造计数器
def inc (): def counter(): i = 0 while True: i += 1 yield i c = counter() # def inc(): # return next(c) # return inc return lambda : next(c) g=inc() print(g()) print(g()) print(g())
协程coroutine
生成器的高级用法
比线程,进程轻量级
在用户空间进行调度
Python3 asyncio 就是协程实现,已加入标准库
Python3.5 使用async、await关键字直接原生支持协程
协程调度器实现
有两个生成器A,B
next(A)后,A执行到yield语句暂停,执行next(B),B执行到yield也暂停,周而复始,实现调度效果
可以引入yield策略来实现切换
非抢占式调度
yield from 是Python 3 .3出现的新语法
yield from iterable 是for item in iterable:yield item 形式的语法糖