详解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 相关文章推荐
Python struct.unpack
Sep 06 Python
Python 2.7.x 和 3.x 版本的重要区别小结
Nov 28 Python
Python中使用Tkinter模块创建GUI程序实例
Jan 14 Python
R vs. Python 数据分析中谁与争锋?
Oct 18 Python
python使用fork实现守护进程的方法
Nov 16 Python
Python多线程中阻塞(join)与锁(Lock)使用误区解析
Apr 27 Python
python pandas中对Series数据进行轴向连接的实例
Jun 08 Python
pycharm修改界面主题颜色的方法
Jan 17 Python
python 3.6.7实现端口扫描器
Sep 04 Python
Python字典的概念及常见应用实例详解
Oct 30 Python
Python入门之基础语法详解
May 11 Python
请求模块urllib之PYTHON爬虫的基本使用
Apr 08 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 前加at符合@的作用解析
2015/07/31 PHP
PHP如何根据文件头检测文件类型实例代码
2018/10/14 PHP
IE innerHTML,outerHTML所引起的问题
2009/06/04 Javascript
NodeJS的模块写法入门(实例代码)
2012/03/07 NodeJs
JQuery防止退格键网页后退的实现代码
2012/03/23 Javascript
JS获取DropDownList的value值与text值的示例代码
2014/01/07 Javascript
jQuery表单域属性过滤器用法分析
2015/02/10 Javascript
JS往数组中添加项性能分析
2015/02/25 Javascript
jquery.validate 自定义验证方法及validate相关参数
2016/01/18 Javascript
JS排序方法(sort,bubble,select,insert)代码汇总
2016/01/30 Javascript
JavaScript实现99乘法表及隔行变色实例代码
2016/02/24 Javascript
jquery分页插件jquery.pagination.js使用方法解析
2016/04/01 Javascript
详谈js中window.location.search的用法和作用
2017/02/13 Javascript
JS实现获取汉字首字母拼音、全拼音及混拼音的方法
2017/11/14 Javascript
AngularJS 将再发布一个重要版本 然后进入长期支持阶段
2018/01/31 Javascript
小程序tab页无法传递参数的方法
2018/08/03 Javascript
微信小程序如何实现精确的日期时间选择器
2020/01/21 Javascript
谈谈JavaScript中的垃圾回收机制
2020/09/17 Javascript
jquery实现淡入淡出轮播图效果
2020/12/13 jQuery
[01:07:21]NAVI vs VG Supermajor 败者组 BO3 第二场 6.5
2018/06/06 DOTA
[32:26]EG vs IG 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
python发送邮件示例(支持中文邮件标题)
2014/02/16 Python
Win10环境python3.7安装dlib模块趟过的坑
2019/08/01 Python
pytorch 在网络中添加可训练参数,修改预训练权重文件的方法
2019/08/17 Python
Python图像处理库PIL的ImageFilter模块使用介绍
2020/02/26 Python
Pygame的程序开始示例代码
2020/05/07 Python
Python使用Paramiko控制liunx第三方库
2020/05/20 Python
keras load model时出现Missing Layer错误的解决方式
2020/06/11 Python
如何解决安装python3.6.1失败
2020/07/01 Python
Watch Station官方网站:世界一流的手表和智能手表
2020/01/05 全球购物
2014年六一儿童节演讲稿
2014/05/23 职场文书
保护地球的标语
2014/06/17 职场文书
合法的离婚协议书范本
2014/10/23 职场文书
2014年优质护理服务工作总结
2014/11/14 职场文书
经典搞笑版检讨书
2015/02/19 职场文书
《狼牙山五壮士》读后感:宁死不屈,视死如归
2019/08/16 职场文书