題記
本系列目標是通過例子由淺入深的理解協程.
讀者
需要有一定的python基礎, 概念部分建議閱讀經典書: 流暢的python 或者 查看w3c school 或者 菜鳥教程
基本概念
生成器:只要 Python 函數的定義體中有 yield 關鍵字,該函數就是生成器函數,調用生成器函數返回的是生成器對象
yield關鍵字:總的來說就是:產出和讓步,產出結果,讓出控制權
send:send() 方法致使協程前進到下一個yield 語句,另外,生成器可以作為協程使用
例子說明
yield的執行流程, 并制作了一個生成器調用的共同方法print_value
def yield1():
'''
整體解釋:1將作為第一個send方法的返回值,b是第二個send方法的參數,
最后的return是作為最后一個send方法的返回值
'''
# 4.yield1()協程:阻塞在此,執行yield產出結果為1,把控制權給主線程
# 9.yield1()協程:阻塞解除,獲得輸入值2,并賦值給b
b = yield 1
# 10.yield1()協程:返回b
return b
def yield2():
'''
協程阻塞在此,執行yield產出結果為None,并交出控制權給主線程
注: 因為yield后面沒有值,所以是None
'''
yield
# 如果沒有返回值,會return None
pass
def yield3():
yield 1
def print_value(f, args):
try:
# 3.print_value方法:對yield1()協程執行send
# 5.print_value方法:接收yield1()協程的返回值1,并賦值給b
# 8.print_value方法:對yield1()協程再次執行send,并傳入2
b = f.send(args)
except StopIteration as e:
'''
11.print_value方法:接收yield1()協程的返回值,
如果是最后一個迭代,就會進入到這個異常捕獲
'''
print(f'{f.__name__}返回值 {e.value}')
return e.value
else:
# 6.print_value方法:打印b
print(f'{f.__name__}接收 {b}')
'''
1.主線程:`yield1`是生成器函數,`yield1()`調用生成器函數,
返回生成器對象也可以稱作協程
'''
ys = [yield1(), yield2(), yield3()]
for y in ys:
# 2.主線程:y是yield1()生成器對象,第一次發送None
# 12.主線程:y是yield2()生成器對象,第一次發送None.
# 注:yield2 yield3根yield1差不多所以12步以后的都略過了
print_value(y, None)
# 7.主線程:第二次send參數為2
print_value(y, 2)
結果:
yield1接收 1
yield1返回值 2
yield2接收 None
yield2返回值 None
yield3接收 1
yield3返回值 None
審核編輯:劉清
-
生成器
+關注
關注
7文章
317瀏覽量
21052 -
python
+關注
關注
56文章
4798瀏覽量
84810
發布評論請先 登錄
相關推薦
評論