详解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入门之modf()方法的使用
May 15 Python
python实现简单socket通信的方法
Apr 19 Python
Python实现好友全头像的拼接实例(推荐)
Jun 24 Python
解决phantomjs截图失败,phantom.exit位置的问题
May 17 Python
Python微医挂号网医生数据抓取
Jan 24 Python
局域网内python socket实现windows与linux间的消息传送
Apr 19 Python
详解Python3序列赋值、序列解包
May 14 Python
python 列表转为字典的两个小方法(小结)
Jun 28 Python
Python求解正态分布置信区间教程
Nov 20 Python
python单向循环链表原理与实现方法示例
Dec 03 Python
python不同系统中打开方法
Jun 23 Python
python与pycharm有何区别
Jul 01 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
调频问题解答
2021/03/01 无线电
PHP实现定时生成HTML网站首页实例代码
2008/11/20 PHP
php引用计数器进行垃圾收集机制介绍
2012/09/19 PHP
nginx下安装php7+php5
2016/07/31 PHP
laravel7学习之无限级分类的最新实现方法
2020/09/30 PHP
XRegExp 0.2: Now With Named Capture
2007/11/30 Javascript
JQUERY设置IFRAME的SRC值的代码
2010/11/30 Javascript
超酷的网页音乐播放器DewPlayer使用方法
2010/12/18 Javascript
jQuery如何取id有.的值一般的方法是取不到的
2014/04/18 Javascript
js实现局部页面打印预览原理及示例代码
2014/07/03 Javascript
JavaScript设计模式之外观模式实例
2014/10/10 Javascript
jQuery学习笔记之jQuery+CSS3的浏览器兼容性
2015/01/19 Javascript
jQuery插件boxScroll实现图片轮播特效
2015/07/14 Javascript
jquery实现图片水平滚动效果代码分享
2015/08/26 Javascript
纯javascript移动优先的幻灯片效果
2015/11/02 Javascript
AngularJS 指令的交互详解及实例代码
2016/09/14 Javascript
详解jQuery的表单验证插件--Validation
2016/12/21 Javascript
bootstrap精简教程_动力节点Java学院整理
2017/07/14 Javascript
Node做中转服务器转发接口
2017/10/18 Javascript
JS Input里添加小图标的两种方法
2017/11/11 Javascript
详解javascript 变量提升(Hoisting)
2019/03/12 Javascript
Vant 中的Toast设置全局的延迟时间操作
2020/11/04 Javascript
使用原生javascript开发计算器实例代码
2021/02/21 Javascript
[13:56]DAC2018 4.5SOLO赛决赛 MidOne vs Paparazi第一场
2018/04/06 DOTA
django 发送手机验证码的示例代码
2018/04/25 Python
Python requests模块实例用法
2019/02/11 Python
python线程的几种创建方式详解
2019/08/29 Python
基于python实现获取网页图片过程解析
2020/05/11 Python
Python中Qslider控件实操详解
2021/02/20 Python
莫斯科高科技在线商店:KremlinStore
2019/03/13 全球购物
超市开业庆典策划方案
2014/05/14 职场文书
安全宣传标语口号
2014/06/06 职场文书
检讨书1000字
2014/10/11 职场文书
2014年团委工作总结
2014/11/13 职场文书
2015年119消防宣传日活动总结
2015/03/24 职场文书
Redis基本数据类型String常用操作命令
2022/06/01 Redis