題記
本系列目標(biāo)是通過例子由淺入深的理解協(xié)程.
讀者
需要有一定的python基礎(chǔ), 概念部分建議閱讀經(jīng)典書: 流暢的python 或者 查看w3c school 或者 菜鳥教程
基本概念
生成器:只要 Python 函數(shù)的定義體中有 yield 關(guān)鍵字,該函數(shù)就是生成器函數(shù),調(diào)用生成器函數(shù)返回的是生成器對象
yield關(guān)鍵字:總的來說就是:產(chǎn)出和讓步,產(chǎn)出結(jié)果,讓出控制權(quán)
send:send() 方法致使協(xié)程前進(jìn)到下一個yield 語句,另外,生成器可以作為協(xié)程使用
例子說明
yield的執(zhí)行流程, 并制作了一個生成器調(diào)用的共同方法print_value
def yield1():
'''
整體解釋:1將作為第一個send方法的返回值,b是第二個send方法的參數(shù),
最后的return是作為最后一個send方法的返回值
'''
# 4.yield1()協(xié)程:阻塞在此,執(zhí)行yield產(chǎn)出結(jié)果為1,把控制權(quán)給主線程
# 9.yield1()協(xié)程:阻塞解除,獲得輸入值2,并賦值給b
b = yield 1
# 10.yield1()協(xié)程:返回b
return b
def yield2():
'''
協(xié)程阻塞在此,執(zhí)行yield產(chǎn)出結(jié)果為None,并交出控制權(quán)給主線程
注: 因為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é)程的返回值,
如果是最后一個迭代,就會進(jìn)入到這個異常捕獲
'''
print(f'{f.__name__}返回值 {e.value}')
return e.value
else:
# 6.print_value方法:打印b
print(f'{f.__name__}接收 ')
'''
1.主線程:`yield1`是生成器函數(shù),`yield1()`調(diào)用生成器函數(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)
結(jié)果:
yield1接收 1
yield1返回值 2
yield2接收 None
yield2返回值 None
yield3接收 1
yield3返回值 None
審核編輯:劉清
-
生成器
+關(guān)注
關(guān)注
7文章
313瀏覽量
20951 -
python
+關(guān)注
關(guān)注
55文章
4768瀏覽量
84376
發(fā)布評論請先 登錄
相關(guān)推薦
評論