Python 中的 Yield 關鍵字


簡介

在 Python 中,“yield” 是一種用於與生成器一起使用的關鍵字。與 Python 中的普通或經典函式不同,普通或經典函式使用“return”關鍵字返回輸出或值,生成器使用“yield”關鍵字來實現相同的功能。

在本文中,我們將討論 Python 中的 yield 關鍵字,它是什麼,它是如何工作的,它的意義是什麼,以及它在 Python 中的實現。本文將幫助讀者瞭解 Python 中的 yield 關鍵字,並幫助讀者在需要時使用和實現它。

因此,讓我們從 yield 關鍵字背後的核心思想開始討論。

什麼是 Yield 關鍵字?

在 Python 中,生成器是一種主要用於迭代過程的函式。顧名思義,當被呼叫時,這些函式會動態生成值或輸出,這意味著它像迭代器一樣工作,連續生成值,而不會停止。

與 Python 中的傳統函式相同,其中使用 return 關鍵字從函式中獲取輸出,在生成器的情況下,yield 關鍵字用於生成臨時輸出,其中生成器函式的執行會暫時停止,並且稍後可以繼續。

在 Python 中,當定義生成器函式來執行與迭代過程相關的某些任務時,使用 next 關鍵字,其中輸出或值會連續生成,並且函式會繼續生成下一個值。一旦遇到 yield 關鍵字,函式就會從那裡停止,在這裡函式會儲存生成器的當前狀態,然後停止。

請注意,當再次恢復或再次執行生成器函式時,值將從它停止的地方開始生成,而不是從開頭開始,因為函式在遇到 yield 關鍵字時會儲存其狀態。

簡而言之,yield 關鍵字可以被認為是生成器關鍵字的斷點,生成器在此關鍵字後停止並儲存其進度,這在普通或傳統函式中不會發生。

Yield 函式的優點

當與生成器函式一起使用時,yield 函式提供了一些優點。讓我們逐一討論它們。

更快的處理過程

眾所周知,生成器是一種動態生成值的函式。藉助 yield 關鍵字,我們可以更快地在生成器上執行操作。它允許生成器即使對於大型資料集也能立即生成值。

無限輸出

使用 yield 關鍵字與生成器一起,我們可以生成無限的值或輸出,因為它是一個迭代過程。

效率

如上所述,yield 關鍵字有助於更快地為生成器函式生成值。yield 關鍵字有助於生成和處理相同的值,而無需任何載入過程,而不是載入所有資料,然後在請求時生成相同的資料。

可擴充套件的程式碼

在為迭代過程編寫程式碼時,程式碼出錯且不可擴充套件的可能性非常高,生成器的 yield 關鍵字有助於編寫高效且可擴充套件的程式碼,這些程式碼也易於理解和解釋。

使用 Yield 關鍵字:程式碼示例

現在讓我們討論一些實現 yield 函式的程式碼示例,以闡明其背後的思想。

示例 1:生成數字的平方

讓我們嘗試實現生成器函式,在其中我們將編寫程式碼以獲取數字的平方。由於我們將在這裡使用生成器,因此值將不斷生成。

# define the generator function to square the numbers
def square_of_numbers(n):
    for i in range(1, n + 1):
        yield i ** 2

# Call the generator function defined above
squares_gen = square_of_numbers(7) #squares of seven numbers will be printed in the output 

for square in squares_gen:
    print(square)

正如我們在上面的程式碼示例中看到的,定義了一個名為 square_generator 的函式,它使用 for 迴圈迭代值,最後使用 yield 關鍵字獲取值的平方。

由於我們透過將 7 作為輸出傳遞來呼叫該函式,因此該函式將為相應值的平方提供七個不同的輸出。

輸出

以下程式碼的輸出將是

1
4
9
16
25
36
49

示例 2:使用過濾器新增字串

現在讓我們以字串為例。在這裡,我們將字串作為輸入,並將使用帶有 yield 關鍵字的生成器函式透過對相同字串應用某些過濾器來新增相應的字串。

def adding_strings_with_filter(str1, str2):
    for char in str1:
        if char.isalpha(): 
            yield char.upper()
    for char in str2:
        if char.isalpha(): 
            yield char.upper()

# Define the two strings to concatenate

# Also, use the join function to join the strings after applying the filter with the help of generator function

string1 = "TutorialsPoint, is good?"
string2 = "123 for tutorials! 456"
result = "".join(adding_strings_with_filter(string1, string2))

print(result)

在這裡,正如我們在上面的程式碼示例中看到的,我們定義了一個名為 add_string_with_filter 的函式,它接受兩個字串作為輸入。然後使用帶有 yield 關鍵字的兩個迴圈來獲取相應的字串,並且在每個迴圈的末尾,yield 關鍵字返回一個不包含字母字元的大寫字元的字串。

最後,使用正常的 join 函式來新增生成器輸出的字串。

輸出

以下程式碼的輸出將是

TUTORIALSPOINTISGOODFORTUTORIALS

示例 3:帶有自定義邏輯的生成器函式

現在讓我們來看一些使用生成器和 yield 關鍵字的獨特示例,在這裡我們將定義一個函式,它將為迴圈中的一些值返回特定的字串值。

# defining the generator function
def custom_logic_generator():
    num = 1
    while True:
        if num % 3 == 0:
            yield "divisible by 3" #print divisible by 3
        elif num % 9 == 0:
            yield "divisible by  3" #print divisible by 3
        elif num % 10 == 0:
            yield "divisible by 10" #print divisible by 10

        else:
            yield num
        num += 1

# call the generator function defined above
seq_gen = custom_logic_generator()

# generate the numbers one by list with the above applied logic of the generators
for _ in range(10):
    print(next(seq_gen))

正如我們在上面的程式碼示例中看到的,定義了一個函式,它列印從 1 到 10 的值。在這裡,我們使用 yield 關鍵字來定義自定義邏輯。例如,如果數字可以被 3 整除,則該函式將返回字串“可以被三整除”,而不是列印 3 作為數值。對於可以被 10 整除的數字也是如此。

輸出

以下程式碼的輸出將是

1
2
divisible by 3
4
5
Divisible by 3
7
8
divisible by 3
divisible by 10

結論

在本文中,我們討論了生成器中的 yield 關鍵字,它是什麼,它是如何工作的,以及 yield 關鍵字和生成器的優點,還討論了兩個不同的程式碼示例來實現它。本文將幫助讀者瞭解 yield 關鍵字背後的核心思想,並幫助讀者在需要時將相同的概念應用於編寫高效程式碼。

更新於: 2023-07-27

261 次瀏覽

啟動你的 職業生涯

透過完成課程獲得認證

立即開始
廣告