詳解Python生成器和基于生成器的協(xié)程
一、什么是生成器
Generator
1.生成器就是可以生成值的函數(shù)
2.當(dāng)一個(gè)函數(shù)里有了 yield關(guān)鍵字就成了生成器
3.生成器可以掛起執(zhí)行并且保持當(dāng)前執(zhí)行的狀態(tài)
代碼示例:
def simple_gen(): yield 'hello' yield 'world' gen = simple_gen() print(type(gen)) # 'generator' object print(next(gen)) # 'hello' print(next(gen)) # 'world'
二、基于生成器的協(xié)程
Python3之前沒有原生協(xié)程,只有基于生成器的協(xié)程
1.pep 342(Coroutines via Enhanced Generators)增強(qiáng)生成器功能
2.生成器可能通過 yield 暫停執(zhí)行和產(chǎn)出數(shù)據(jù)
3.同時(shí)支持send()向生成器發(fā)送數(shù)據(jù)和throw()向生成器拋出異常
Generator Based Corouteine代碼示例:
def coro():
hello = yield 'hello' # yield 關(guān)鍵字在 = 右邊作為表達(dá)式,可以被 send 值
yield hello
c = coro()
# 輸出 'hello', 這里調(diào)用 next 產(chǎn)出第一個(gè)值 'hello',之后函數(shù)暫停
print(next(c))
# 再次調(diào)用 send 發(fā)送值,此時(shí) hello 變量賦值為 'world',然后 yield 產(chǎn)出 hello 變量的值 'world'
print(c.send('world'))
# 之后協(xié)程結(jié)束,后續(xù)再 send 值會(huì)拋出異常 StopIteration
運(yùn)行結(jié)果:

三、協(xié)程的注意點(diǎn)
協(xié)程注意點(diǎn)
1.協(xié)程需要使用send(None)或者next(coroutine)來預(yù)激(prime)才能啟動(dòng)
2.在yield處協(xié)程會(huì)暫停執(zhí)行
3.單獨(dú)的yield value會(huì)產(chǎn)出值給調(diào)用方
4.可以通過 coroutine.send(value)來給協(xié)程發(fā)送值,發(fā)送的值會(huì)賦值給 yield表達(dá)式左邊的變量value = yield
5.協(xié)程執(zhí)行完成后(沒有遇到下一個(gè)yield語句)會(huì)拋出StopIteration異常
四、協(xié)程裝飾器
避免每次都要用 send 預(yù)激它
from functools import wraps def coroutine(func): # 這樣就不用每次都用 send(None) 啟動(dòng)了 “”“裝飾器:向前執(zhí)行到一個(gè) `yield` 表達(dá)式,預(yù)激 `func` ”“” @wrops(func) def primer(*args, **kwargs): # 1 gen = func(*args, **kwargs) # 2 next(gen) # 3 return gen # 4 return primer
五、python3原生協(xié)程
python3.5引入 async/await支持原生協(xié)程(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()
到此這篇關(guān)于詳解Python生成器和基于生成器的協(xié)程的文章就介紹到這了,更多相關(guān)Python生成器與協(xié)程內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解HttpRunner3的HTTP請(qǐng)是如何發(fā)出
這篇文章主要為大家介紹了HttpRunner3的HTTP請(qǐng)是如何發(fā)出詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07
python機(jī)器學(xué)習(xí)pytorch自定義數(shù)據(jù)加載器
這篇文章主要為大家介紹了python機(jī)器學(xué)習(xí)pytorch自定義數(shù)據(jù)加載器使用示例學(xué)習(xí),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10
利用Python實(shí)現(xiàn)一個(gè)簡單的Web匯率計(jì)算器
Dash?是一個(gè)用于構(gòu)建基于?Web?的應(yīng)用程序的?Python?庫,無需?JavaScript?。本文將利用Dash編寫一個(gè)簡單的Web匯率計(jì)算器,感興趣的可以了解一下2022-08-08
PyTorch-Forecasting一個(gè)新的時(shí)間序列預(yù)測庫使用詳解
這篇文章主要為大家介紹了PyTorch-Forecasting一個(gè)新的時(shí)間序列預(yù)測庫示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05

