Python yield 與 send 實現協程

2021-08-20 13:34:55 字數 902 閱讀 5347

我們來看看在函式內部含有yield語句達到的效果。首先,我們來看看以下**:

def

foo():

while

true:

x = yield

print("

value:

",x)

g =foo() # g是乙個生成器

next(g) # 程式執行到yield就停住了,等待下乙個next

g.send(1) # 我們給yield傳送值1,然後這個值被賦值給了x,並且列印出來,然後繼續下一次迴圈停在yield處

g.send(2) # 同上

next(g) # 沒有給x賦值,執行print語句,列印出none,繼續迴圈停在yield處

我們都知道,程式一旦執行到yield就會停在該處,並且將其返回值進行返回。上面的例子中,我們並沒有設定返回值,所有預設程式返回的是none。我們通過列印語句來檢視一下第一次next的返回值:

print

(next(g))

####輸出結果#####

none

正如我們所說的,程式返回none。接著程式往下執行,但是並沒有看到next()方法。為什麼還會繼續執行yield語句後面的**呢?這是因為,send()方法具有兩種功能:第一,傳值,send()方法,將其攜帶的值傳遞給yield,注意,是傳遞給yield,而不是x,然後再將其賦值給x;第二,send()方法具有和next()方法一樣的功能,也就是說,傳值完畢後,會接著上次執行的結果繼續執行,知道遇到yield停止。這也就為什麼在呼叫g.send()方法後,還會列印出x的數值。有了上面的分析,我們可以很快知道,執行了send(1)後,函式被停止在了yield處,等待下乙個next()的到來。程式往下執行,有遇到了send(2),其執行流程與send(1)完全一樣。

Python yield的理解與簡單測試

在學習非同步io,會涉及到協程,最簡單的協程,可以用yield來模擬,最初學習yield的時候就沒搞太明白,今天看了些部落格,終於搞得懂了。下面給出乙個作者的總結的知識點,讓我理解了。謝謝 主要的掌握 1.通常的for.in.迴圈中,in後面是乙個陣列,這個陣列就是乙個可迭代物件,類似的還有鍊錶,字...

python yield 學習筆記

學習yield之前,了解了迭代器,生成器的概念。沒有太多的細化。迭代器物件 支援iter和next 方法,其中iter 方法返回迭代物件本身 next 方法返回容器的下乙個元素,在結尾時印發stopiteration異常。生成器是迭代器,但是只能遍歷一次。yield返回的就是生成器。看例項,銀行生成...

python yield用法,簡單

學習python的過程過程彙總,經常會遇到yield,但是經常是懵逼的狀態,到底是怎麼用的,自己寫了乙個函式後就明白了,其實很簡單,看下面就懂了。函式中yield用法def yield tst n while n 20 yield 返回 遇到yield就返回yield後面的值,相當於return 返...