在Python 生成器中一起使用Return 和Yield
在Python 2 中,也使用了Yield 的生成器函數內的return語句將導致一個錯誤。然而,在Python 3.3中,卻發生了微妙的變化。
代碼示範
考慮以下Python 3.3代碼:
def f():
return 3
yield 2
x = f()
print(x.__next__())
解釋
在此程式碼中,函數 f 包含 return 語句和yield 語句。呼叫函數時,先執行return語句,傳回值3。因此,yield 語句不會被執行。
當透過呼叫 next 方法迭代生成器 x 時,會引發 StopIteration 異常,其值為 3。這表示生成器的迭代器耗盡,return 語句傳回的值可作為異常的 value 屬性。
Python 3.3 中的新機制
根據 PEP 380 ,此行為是 Python 3.3 中引入的新功能。相當於寫:
def f():
yield 3
raise StopIteration
Yield from
的範例以下範例示範了此行為如何影響使用Yield from 語法委託的產生器:
def f():
return 1
yield 2
def g():
x = yield from f()
print(x)
# g is still a generator so we need to iterate to run it:
for _ in g():
pass
在這種情況下,yield from語句委託給生成器f。由於 f 傳回一個值,但不再有yield 語句,因此列印值 1。但是f中的yield 2語句並沒有被執行。
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3