- 参考资料
- http://python.jobbole.com/86481/
- http://python.jobbole.com/87310/
- http://segmentfault.com/a/1190000009781688
- 迭代器
- 可迭代(Iterable):直接作用于for循环的变量
- 迭代器(Iterator):不但可以作用于for循环,还可以被next调用
- list是典型的可迭代对象,但不是迭代器
- 判断:isinstance()
- iterable和iterator之间转换:iter()
- 生成器
- generator:一边循环以便计算下一个元素的算法
- 需要满足三个条件:
- 每次调用都生产出for循环需要的下一个元素
- 如果达到最后一个,爆出StopIteration异常
- 可以被next函数调用
- 如何生成生成器:
- 直接使用
L = [xx for x in range(5)] # 放在中括号中是列表生成器
L = (xx for x in range(5)) # 放在小括号中是生成器 - 如果函数中包含yield,则这个函数叫生成器
next调用函数,遇到yield返回
- 直接使用
协程
- 历史进程
- 3.4引进协程,用yield实现
- 3.5引入协程语法
- 实现协程比较好的包:asyncio,tornado,gevent
- 从技术角度讲,协程就是一个可以暂停执行的函数。也可以理解成生成器
- 协程实现:
- yield返回
- send调用
- 协程四个状态
- 协程终止
- 协程中未处理的异常会向上冒泡,传给next函数,或send方法的调用方(即触发
协程的对象) - 终止协程:发送某个哨符值,让协程退出,内置的None和Ellipsis等敞亮经常用作哨符值==
- 协程中未处理的异常会向上冒泡,传给next函数,或send方法的调用方(即触发
- yield from
- 调用协程为了得到返回值,协程必须正常终止
- 生成器正常终止会发出StopIteration异常,异常对象的value属性保存返回值
- yield from从内部捕获StopIteration异常
- 委派生成器
- 包含yield from表达式的生成器函数
- 委派生成器在yield from表达式处暂停,调用方可以直接吧数据发给子生成器
- 子生成器再把阐述的值发给调用方
- 子生成器在最后,解释器会抛出StopIteration,并且把返回值附加到异常对象上
- asyncio
- python3.4开始引入标准库中,内置对异步io的支持
- 本身是一个消息循环
- 步骤:
- 创建消息循环
- 把协程导入
- 关闭
- async and await
- python3.5引入
- 让协程代码更简洁
- 使用上可以简单进行替换
- 用async替换@asyncio.coroutine
- 用await替换yield from
- aiohttp
- 在服务器端乐意asyncio + coroutine配合,因为http是io操作
- asyncio实现了tcp,udp,ssl等协议
- aiohttp是给予asyncio实现的http框架
- pip install aiohttp安装
- concurrent.futures
- python3新增库
- 类似其他语言的线程池概念
- 利用multiprocessiong实现正真的并行计算
- 核心原理
- future