Python 官方文档:入门教程 => 点击学习
小编给大家分享一下python生成器和基于生成器的协程,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!一、什么是生成器Generator生成器就是可以生成值的函数2.当一个函数里有了 yield关键字就成了生成器3.生成器可
小编给大家分享一下python生成器和基于生成器的协程,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!
Generator
生成器就是可以生成值的函数
2.当一个函数里有了 yield
关键字就成了生成器
3.生成器可以挂起执行并且保持当前执行的状态
代码示例:
def simple_gen():yield 'hello'yield 'world'gen = simple_gen()print(type(gen)) # 'generator' objectprint(next(gen)) # 'hello'print(next(gen)) # 'world'
python3
之前没有原生协程,只有基于生成器的协程
pep
342(Coroutines via Enhanced Generators
)增强生成器功能
2.生成器可能通过 yield
暂停执行和产出数据
3.同时支持send()
向生成器发送数据和throw()
向生成器抛出异常
Generator Based Corouteine代码示例:
def coro():hello = yield 'hello' # yield 关键字在 = 右边作为表达式,可以被 send 值yield helloc = coro()# 输出 'hello', 这里调用 next 产出第一个值 'hello',之后函数暂停print(next(c))# 再次调用 send 发送值,此时 hello 变量赋值为 'world',然后 yield 产出 hello 变量的值 'world'print(c.send('world'))# 之后协程结束,后续再 send 值会抛出异常 StopIteration
运行结果:
协程注意点
协程需要使用send(None)
或者next(coroutine)
来预激(prime
)才能启动
2.在yield
处协程会暂停执行
3.单独的yield value
会产出值给调用方
4.可以通过 coroutine.send(value)
来给协程发送值,发送的值会赋值给 yield
表达式左边的变量value = yield
5.协程执行完成后(没有遇到下一个yield
语句)会抛出StopIteration
异常
避免每次都要用 send
预激它
from functools import wrapsdef coroutine(func): # 这样就不用每次都用 send(None) 启动了“”“装饰器:向前执行到一个 `yield` 表达式,预激 `func` ”“”@wrops(func)def primer(*args, **kwargs): # 1gen = func(*args, **kwargs) # 2next(gen) # 3return gen # 4return primer
python3.5引入 async/await支持原生协程(native coroutine)
import asyncioimport datetimeimport randomasync def display_date(num, loop):end_time = loop.time() + 50.0while True:print('Loop: {} Time: {}'.fORMat(num, datetime.datetime.now())if (loop.time() + 1.0) >= end_time:breakawait 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频道,感谢各位的阅读!
--结束END--
本文标题: Python生成器和基于生成器的协程
本文链接: https://lsjlt.com/news/279094.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-03-01
2024-03-01
2024-03-01
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0