Python 中的 yield 關鍵字

Muhammad Waiz Khan 2021年4月29日
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() 將產生從 1100 的新數字,並一直工作到 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

相關文章 - Python Keyword