Python中協(xié)程(coroutine)和生成器(generator)的區(qū)別

協(xié)程和生成器都使用yield關(guān)鍵字。但是協(xié)程更像是對(duì)生成器語(yǔ)法的一些擴(kuò)展

  • 在生成器中, yield 只對(duì)外產(chǎn)出值
  • 在協(xié)程中,yield能對(duì)外產(chǎn)出值,而且能接收通過(guò)send()方法傳入值
下面是一段生成器的代碼
def simple_generator():
  c = yield 1
  if c is None:
    print("c is None")

# 代碼運(yùn)行后,返回結(jié)果為
# generator = simple_generator()
# next(generator) -> 1
# next(generator) -> c is None

可以發(fā)現(xiàn)生成器語(yǔ)法中, generator不返回值。
上面的代碼等價(jià)于

def simple_generator():
  yield 1
下面是一段協(xié)程的代碼
def simple_coro2(a):
  print("->  Started: a =", a)
  b = yield a
  print("-> Received: b: =", b)
  c = yield a + b
  print("-> Received: c=", c)
當(dāng)前代碼的執(zhí)行結(jié)果

可以看到在生成器中,每次調(diào)用send()方法時(shí),yield語(yǔ)句對(duì)外返回yield右側(cè)的值,再將輸入的值賦值給左側(cè)的變量。所以協(xié)程在yield上做了拓展。能接收一些參數(shù)

協(xié)程有四個(gè)狀態(tài)

  • GEN_CREATED
  • GEN_RUNNING
  • GEN_SUSPEND
  • GEN_CLOSED

每個(gè)協(xié)程在使用時(shí),必須進(jìn)行初始化。否則拋出異常

TypeError: can't send non-None value to a just-started generator

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 從語(yǔ)法上來(lái)看,協(xié)程和生成器類(lèi)似,都是定義體中包含yield關(guān)鍵字的函數(shù)。yield在協(xié)程中的用法:在協(xié)程中yiel...
    JokerW閱讀 1,863評(píng)論 0 0
  • 在此處先列下本篇文章的主要內(nèi)容 簡(jiǎn)介 next方法的參數(shù) for...of循環(huán) Generator.prototy...
    醉生夢(mèng)死閱讀 1,488評(píng)論 3 8
  • Coroutine in Python 引言: 本文出自David Beazley 的關(guān)于協(xié)程的PPT,現(xiàn)在筆者將...
    LumiaXu閱讀 1,713評(píng)論 4 8
  • 老秀才挪到這家百貨店的第一級(jí)臺(tái)階上時(shí),再也挪不動(dòng)了。他太老了! 他不是去買(mǎi)東西,他太老了,只要有口飯吃,什么都不需...
    鍵盤(pán)上的狗狗閱讀 378評(píng)論 0 2
  • 這是大劉的一個(gè)短篇故事,以混沌理論為基礎(chǔ)。大劉的其他文章都沒(méi)有《三體》那么出名,也沒(méi)有那么宏大的架構(gòu),但畢竟是資深...
    chaos_theory閱讀 2,307評(píng)論 1 2

友情鏈接更多精彩內(nèi)容