详解Python生成器和基于生成器的协程


Posted in Python onJune 03, 2021

一、什么是生成器

Generator

1.生成器就是可以生成值的函数
2.当一个函数里有了 yield关键字就成了生成器
3.生成器可以挂起执行并且保持当前执行的状态

代码示例:

def simple_gen():
	yield 'hello'
	yield 'world'

gen = simple_gen()
print(type(gen))  # 'generator' object
print(next(gen))  # 'hello'
print(next(gen))  # 'world'

二、基于生成器的协程

Python3之前没有原生协程,只有基于生成器的协程

1.pep 342(Coroutines via Enhanced Generators)增强生成器功能
2.生成器可能通过 yield 暂停执行和产出数据
3.同时支持send()向生成器发送数据和throw()向生成器抛出异常

Generator Based Corouteine代码示例:

def coro():
	hello = yield 'hello'  # yield 关键字在 = 右边作为表达式,可以被 send 值
	yield hello

c = coro()
# 输出 'hello', 这里调用 next 产出第一个值 'hello',之后函数暂停
print(next(c))
# 再次调用  send 发送值,此时 hello 变量赋值为 'world',然后 yield 产出 hello 变量的值 'world'
print(c.send('world'))
# 之后协程结束,后续再 send 值会抛出异常 StopIteration

运行结果:

详解Python生成器和基于生成器的协程

三、协程的注意点

协程注意点

1.协程需要使用send(None)或者next(coroutine)来预激(prime)才能启动
2.在yield处协程会暂停执行
3.单独的yield value会产出值给调用方
4.可以通过 coroutine.send(value)来给协程发送值,发送的值会赋值给 yield表达式左边的变量value = yield
5.协程执行完成后(没有遇到下一个yield语句)会抛出StopIteration异常

四、协程装饰器

避免每次都要用 send 预激它

from functools import wraps

def coroutine(func):  # 这样就不用每次都用 send(None) 启动了
	“”“装饰器:向前执行到一个 `yield` 表达式,预激 `func` ”“”
	@wrops(func)
	def primer(*args, **kwargs):   # 1
		gen = func(*args, **kwargs)  # 2
		next(gen)  # 3
		return gen  # 4
	return primer

五、python3原生协程

python3.5引入 async/await支持原生协程(native coroutine)

import asyncio
import datetime
import random

async def display_date(num, loop):
	end_time = loop.time() + 50.0
	while True:
		print('Loop: {} Time: {}'.format(num, datetime.datetime.now())
		if (loop.time() + 1.0) >= end_time:
			break
		await asyncio.sleep(random.randint(0, 5))

loop = asyncio.get_event_loop()
asyncio.ensure_future(display_date(1, loop))
asyncio.ensure_future(display_date(2, loop))
loop.run_forever()

 

到此这篇关于详解Python生成器和基于生成器的协程的文章就介绍到这了,更多相关Python生成器与协程内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
2018年Python值得关注的开源库、工具和开发者(总结篇)
Jan 04 Python
用Eclipse写python程序
Feb 10 Python
Python装饰器原理与简单用法实例分析
Apr 29 Python
详解Python的hasattr() getattr() setattr() 函数使用方法
Jul 09 Python
利用Python如何批量修改数据库执行Sql文件
Jul 29 Python
PyTorch之图像和Tensor填充的实例
Aug 18 Python
python 一篇文章搞懂装饰器所有用法(建议收藏)
Aug 23 Python
检测tensorflow是否使用gpu进行计算的方式
Feb 03 Python
Python3使用腾讯云文字识别(腾讯OCR)提取图片中的文字内容实例详解
Feb 18 Python
利用Python计算KS的实例详解
Mar 03 Python
Selenium基于PIL实现拼接滚动截图
Apr 10 Python
Python 发送邮件方法总结
Aug 10 Python
实例讲解Python中sys.argv[]的用法
Jun 03 #Python
Django与数据库交互的实现
Jun 03 #Python
Python代码风格与编程习惯重要吗?
Jun 03 #Python
python 经纬度求两点距离、三点面积操作
Jun 03 #Python
如何使用PyCharm及常用配置详解
python for循环赋值问题
Jun 03 #Python
python批量创建变量并赋值操作
Jun 03 #Python
You might like
php去除换行符的方法小结(PHP_EOL变量的使用)
2013/02/16 PHP
解析php时间戳与日期的转换
2013/06/06 PHP
ThinkPHP 3.2.3实现页面静态化功能的方法详解
2017/08/03 PHP
PHP实现微信支付(jsapi支付)流程步骤详解
2018/03/15 PHP
php实现每日签到功能
2018/11/29 PHP
JsRender实用入门教程
2014/10/31 Javascript
js使用递归解析xml
2014/12/12 Javascript
JS基于cookie实现来宾统计记录访客信息的方法
2015/08/04 Javascript
jQuery实现图片预加载效果
2015/11/27 Javascript
BootStrap3学习笔记(一)之网格系统
2016/05/20 Javascript
AngularJS入门教程之XHR和依赖注入详解
2016/08/18 Javascript
微信小程序 WXML、WXSS 和JS介绍及详解
2016/10/08 Javascript
jQuery监听浏览器窗口大小的变化实例
2017/02/07 Javascript
JS数组操作中的经典算法实例讲解
2017/07/26 Javascript
史上最全JavaScript数组去重的十种方法(推荐)
2017/08/17 Javascript
JS实现不用中间变量temp 实现两个变量值得交换方法
2018/02/04 Javascript
JavaScript循环遍历你会用哪些之小结篇
2018/09/28 Javascript
微信小程序如何实现radio单选框单击打勾和取消
2020/01/21 Javascript
Openlayers实现扩散的动态点(水纹效果)
2020/08/17 Javascript
python 运算符 供重载参考
2009/06/11 Python
Python读写Excel文件的实例
2013/11/01 Python
Django中多种重定向方法使用详解
2019/07/17 Python
pyqt5、qtdesigner安装和环境设置教程
2019/09/25 Python
Python3.7在anaconda里面使用IDLE编译器的步骤详解
2020/04/29 Python
python os模块常用的29种方法使用详解
2020/06/02 Python
Keras 加载已经训练好的模型进行预测操作
2020/06/17 Python
Win10环境中如何实现python2和python3并存
2020/07/20 Python
python如何将图片转换素描画
2020/09/08 Python
CSS3实现多重边框的方法总结
2016/05/31 HTML / CSS
HTML如何让IMG自动适应DIV容器大小的实现方法
2020/02/25 HTML / CSS
建筑工程技术应届生求职信
2013/11/17 职场文书
材料采购员岗位职责
2013/12/17 职场文书
小学生环保演讲稿
2014/04/25 职场文书
入党积极分子批评与自我批评思想汇报
2014/09/14 职场文书
教师自我剖析材料范文
2014/09/30 职场文书
2015年“七七卢沟桥事变”纪念活动总结
2015/03/24 职场文书