題記
本系列目標是通過例子由淺入深的理解協(xié)程.
讀者
需要有一定的python基礎, 概念部分建議閱讀經(jīng)典書: 流暢的python 或者 查看w3c school 或者 菜鳥教程
基本概念
生成器:只要 Python 函數(shù)的定義體中有 yield 關鍵字,該函數(shù)就是生成器函數(shù),調用生成器函數(shù)返回的是生成器對象
yield關鍵字:總的來說就是:產(chǎn)出和讓步,產(chǎn)出結果,讓出控制權
send:send() 方法致使協(xié)程前進到下一個yield 語句,另外,生成器可以作為協(xié)程使用
例子說明
yield的執(zhí)行流程, 并制作了一個生成器調用的共同方法print_value
def yield1():
'''
整體解釋:1將作為第一個send方法的返回值,b是第二個send方法的參數(shù),
最后的return是作為最后一個send方法的返回值
'''
# 4.yield1()協(xié)程:阻塞在此,執(zhí)行yield產(chǎn)出結果為1,把控制權給主線程
# 9.yield1()協(xié)程:阻塞解除,獲得輸入值2,并賦值給b
b = yield 1
# 10.yield1()協(xié)程:返回b
return b
def yield2():
'''
協(xié)程阻塞在此,執(zhí)行yield產(chǎn)出結果為None,并交出控制權給主線程
注: 因為yield后面沒有值,所以是None
'''
yield
# 如果沒有返回值,會return None
pass
def yield3():
yield 1
def print_value(f, args):
try:
# 3.print_value方法:對yield1()協(xié)程執(zhí)行send
# 5.print_value方法:接收yield1()協(xié)程的返回值1,并賦值給b
# 8.print_value方法:對yield1()協(xié)程再次執(zhí)行send,并傳入2
b = f.send(args)
except StopIteration as e:
'''
11.print_value方法:接收yield1()協(xié)程的返回值,
如果是最后一個迭代,就會進入到這個異常捕獲
'''
print(f'{f.__name__}返回值 {e.value}')
return e.value
else:
# 6.print_value方法:打印b
print(f'{f.__name__}接收 {b}')
'''
1.主線程:`yield1`是生成器函數(shù),`yield1()`調用生成器函數(shù),
返回生成器對象也可以稱作協(xié)程
'''
ys = [yield1(), yield2(), yield3()]
for y in ys:
# 2.主線程:y是yield1()生成器對象,第一次發(fā)送None
# 12.主線程:y是yield2()生成器對象,第一次發(fā)送None.
# 注:yield2 yield3根yield1差不多所以12步以后的都略過了
print_value(y, None)
# 7.主線程:第二次send參數(shù)為2
print_value(y, 2)
結果:
yield1接收 1
yield1返回值 2
yield2接收 None
yield2返回值 None
yield3接收 1
yield3返回值 None
審核編輯:劉清
-
生成器
+關注
關注
7文章
322瀏覽量
22709 -
python
+關注
關注
57文章
4876瀏覽量
90025
發(fā)布評論請先 登錄
解析Linux的進程、線程和協(xié)程
FreeRTOS任務和協(xié)程的區(qū)別是什么
ucos與freertos哪個好?
通過攜程API接口使用關鍵詞搜索酒店列表
通過接口獲取攜程酒店詳情數(shù)據(jù)的技術實現(xiàn)
NICE協(xié)處理器接口信號解讀--以demo為例
利用Verdi調試協(xié)處理器的實現(xiàn)步驟
MD5信息摘要算法實現(xiàn)二(基于蜂鳥E203協(xié)處理器)
NICE協(xié)處理器demo分析及測試
基于E203 NICE協(xié)處理器擴展指令
基于E203 NICE協(xié)處理器擴展指令2.0
廣汽星源增程技術暨昊鉑HL增程版上市發(fā)布會定檔
LuatOS協(xié)程深度解析:小白也能10分鐘學會,代碼效率直接起飛!
10分鐘上手寫代碼,LuatOS協(xié)程輕松掌握!
通過例子由淺入深的理解yield協(xié)程
評論