Python 中的 yield 關鍵字
本教程將解釋 Python 中 yield
關鍵字的用途和用法。yield
關鍵字是用於在 Python 中定義生成器函式的語句。yield
語句只能在函式體內使用。
生成器函式和常規函式之間的主要區別在於,生成器函式包含一個 yield
表示式而不是 return
語句。yield
語句產生一系列稱為生成器迭代器的值作為輸出。可以使用 next()
函式或 for
迴圈從迭代器中獲取新值。
每次呼叫 next()
函式或 for
迴圈的每次迭代時,yield
語句都會產生或產生一個新值,並儲存該函式的位置執行狀態,即區域性變數的值,等等。在每個新的 next()
函式呼叫或迭代中,yield
語句從上次儲存的狀態恢復,這與在每個呼叫處開始的 return
語句不同。
Python 中 yield
關鍵字的示例程式碼
由於 yield
語句的工作方式很清楚,現在讓我們研究一下它的用法和示例程式碼。假設我們有大量資料,並且無法一次將其載入到可迭代物件中,或者我們想要一種記憶體效率更高的方式來讀取資料。我們可以使用 yield 語句建立一個生成器函式;該函式將在每次迭代或 next()
函式呼叫時讀取併產生新的資料塊。
下面的示例程式碼演示瞭如何在 for
迴圈中使用 yield
語句在 Python 中建立一個簡單的生成器函式。在下面的示例程式碼中,生成器函式 my_generator()
將產生從 1
到 100
的新數字,並一直工作到 99
為止。
def my_generator():
for x in range(1, 100):
print("new value is generated!")
yield x
我們首先需要一個生成器迭代器物件,以使用 next()
函式或通過迭代來生成值。
gen_iter = my_generator()
現在,使用 next()
函式從生成器迭代器獲取新值;我們還可以將 next()
函式用作 iterator.__next__()
,如下面的示例程式碼所示。
val = next(gen_iter)
print("Value =", val)
val = gen_iter.__next__()
print("Value =", val)
輸出:
new value is generated!
Value = 1
new value is generated!
Value = 2
獲得新值的另一種方法是使用 for
迴圈遍歷生成器迭代器物件。下面的示例程式碼演示瞭如何在 Python 中迭代生成器迭代器物件。
for val in gen_iter:
print("Value =", val)
上面的程式碼示例將在生成器函式中生成指定範圍內的所有 99
值。
我們還可以通過多次使用 yield
語句來建立不具有 for
迴圈的生成器函式,如下面的示例程式碼所示。
def my_generator():
x = 1
print("new value is generated!")
yield x
x = x + 1
print("new value is generated!")
yield x
x = x + 1
print("new value is generated!")
yield x
現在,讓我們使用新的生成器函式通過 for
迴圈生成所有值。
gen_iter = my_generator()
for val in gen_iter:
print("Value =", val)
輸出:
new value is generated!
Value = 1
new value is generated!
Value = 2
new value is generated!
Value = 3