python yield和send
阿新 • • 發佈:2019-02-05
包含yield表示式的函式是特殊的函式,叫做生成器函式(generator function),被呼叫時將返回一個迭代器(iterator),呼叫時可以使用next或send(msg)。它的用法與return相似,區別在於它會記住上次迭代的狀態,繼續執行。
send(msg)與next()的區別在於send可以傳遞引數給yield表示式,這時傳遞的引數會作為yield表示式的值,而yield的引數是返回給呼叫者的值。初始呼叫時必須先next()或send(None),否則會報錯。
舉個例子:
首先生成一個迭代器f,f.next()會使生成器函式執行到yield,生成一個值然後掛起。
然後f.next()或f.send(msg)會在生成器函式內部返回值,執行到下一個yield,生成值後掛起
然後f.next()或f.send(msg)會在生成器函式內部返回值,意圖執行到下一個yield,但是後面沒有yield了,所以丟擲異常。
使用yield可以有效簡化程式碼,並減少空間浪費。
舉個簡單例子:列表中的每個元素+1
傳統寫法:
Python程式碼
Python程式碼
Python程式碼
send(msg)與next()的區別在於send可以傳遞引數給yield表示式,這時傳遞的引數會作為yield表示式的值,而yield的引數是返回給呼叫者的值。初始呼叫時必須先next()或send(None),否則會報錯。
舉個例子:
首先生成一個迭代器f,f.next()會使生成器函式執行到yield,生成一個值然後掛起。
然後f.next()或f.send(msg)會在生成器函式內部返回值,執行到下一個yield,生成值後掛起
然後f.next()或f.send(msg)會在生成器函式內部返回值,意圖執行到下一個yield,但是後面沒有yield了,所以丟擲異常。
使用yield可以有效簡化程式碼,並減少空間浪費。
舉個簡單例子:列表中的每個元素+1
傳統寫法:
Python程式碼
-
def addlist(alist):
-
r = []
-
for i in alist:
-
r.append(i+1)
- return r
Python程式碼
-
def addlist(alist):
-
for i in alist:
- yield i + 1
Python程式碼
- [i+1 for i in alist]