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