gpt4 book ai didi

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

转载 作者:qq735679552 更新时间:2022-09-27 22:32:09 26 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章详解Python生成器和基于生成器的协程由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

1、什么是生成器

Generator 。

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

代码示例:

?
1
2
3
4
5
6
7
8
def simple_gen():
     yield 'hello'
     yield 'world'
 
gen = simple_gen()
print ( type (gen))  # 'generator' object
print ( next (gen))  # 'hello'
print ( next (gen))  # 'world'

2、基于生成器的协程

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

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

Generator Based Corouteine代码示例:

?
1
2
3
4
5
6
7
8
9
10
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生成器和基于生成器的协程

3、协程的注意点

协程注意点 。

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

4、协程装饰器

避免每次都要用 send 预激它 。

?
1
2
3
4
5
6
7
8
9
10
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

5、python3原生协程

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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生成器与协程内容请搜索我以前的文章或继续浏览下面的相关文章希望大家以后多多支持我! 。

原文链接:https://blog.csdn.net/u014257214/article/details/117433239 。

最后此篇关于详解Python生成器和基于生成器的协程的文章就讲到这里了,如果你想了解更多关于详解Python生成器和基于生成器的协程的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com