迭代器
- 可迭代:直接作用于for循环的变量
- 迭代器:可作用于for循环,还可以被next调用
- isinstance判断
- iterable和iterator可以转换
生成器
- generator
- 包含yield
- 遇到yield返回,并且记住当前位置,下一次执行从上一次返回的位置
- next()调用
L = [x*x for x in range(5)]
g = (x*x for x in range(5))
print(type(L))
print(type(g))
<class 'list'>
<class 'generator'>
协程
- 是为非抢占式多任务产生子程序的计算机程序组件,协程允许不同入口点在不同位置暂停或开始执行程序,可以理解成一个生成器。
- 协程实现:
- 协程的四个状态
- inspect.getgeneratorstate(…):函数确定,返回以下字段中的一个
- GEN_GREATE:等待开始执行
- GEN_RUNNING:解释器正在执行
- GEN_SUSPENED:在yield表达式处暂停
- GEN_CLOSED:执行结束
- NXET预激(prime)
- 协程终止
- 协程终止未处理的异常会向上冒泡至触发者
- 终止协程的一种方式:发送哨兵值(None、Ellipse等)
- yield from
- 调用协程为了得到返回值,协程必须正常终止
- 生成器正常终止会发出StopInteration异常,异常对象的value值属性保存到返回值
- yield from从内部捕获StopInteration异常
- 委派生成器
- 包含yield from 生成器函数
- 在yield from表达式的地方暂停,调用者可以直接把数据发给子生成器
- 子生成器再把产出的值发送给调用者
- 子生成器最后,解释器会抛出StopInteration异常,并且把返回值附加到异常对象上
asyncio消息循环
async/await
aiohttp
- asyncio实现单线程的并发io,客户端用处不大
- 在服务端可以实现asyncio+coruntine,由于http是异步操作
- asyncio实现了tcp,udp,ssl等协议
- aiohttp是用asyncio实现的http框架
concurrent