本文包含以下四部分:
- yeild 介紹
- yeild 案例
- 簡單的例子對比yeild和常規函式
- 復雜的例子說明yeild 與普通函式的差異
1. yeild 介紹
yield 是 Python 的一個關鍵字,用于從一個函式中回傳一個生成器(generator),生成器是一種特殊型別的迭代器,它允許你延遲計算結果,這在處理大資料或者創建復雜資料結構時特別有用,因為你不需要一次性將所有的資料都存盤在記憶體中,
一個使用 yield 的函式會被稱為生成器函式,這種函式并不直接回傳一個值,而是生成一系列的值,每次呼叫這個生成器函式,它會從上次離開的地方繼續執行,并且可以產生許多結果,而不是單個值,
2. yeild 案例
以下是一個簡單的使用 yield 的例子
點擊查看代碼
def simple_generator():
yield 1
yield 2
yield 3
> 使用生成器
for num in simple_generator():
print(num)
輸出:
點擊查看代碼
1
2
3
在上面的例子中,simple_generator 是一個生成器函式,它生成了三個值:1, 2, 和 3,在 for 回圈中,每次迭代都會從生成器中獲取一個新的值,
可以想象,每當 yield 被呼叫時,函式會生成一個新的值,然后暫停執行,當下一個值被請求時(例如,在 for 回圈中的下一次迭代),函式會從上次離開的地方恢復執行,再次運行到 yield 陳述句,然后再次暫停,
這就是 yield 的基本用法,它在處理大資料集或創建復雜的資料結構時特別有用,因為它允許你按需生成和處理資料,而不是一次性生成所有資料并一次性處理所有資料,這樣可以大大節省記憶體,
3. 簡單的例子對比yeild和常規函式
當然,讓我們通過一個簡單的例子來展示 yield 的用法,以及與常規函式回傳一個完整串列的區別,
首先,讓我們創建一個常規的函式,該函式將回傳一個串列,其中包含從0到n的所有數字:
點擊查看代碼
def create_numbers(n):
num_list = []
for i in range(n):
num_list.append(i)
return num_list
nums = create_numbers(5)
for num in nums:
print(num)
此函式將創建一個包含所有數字的串列,然后回傳這個串列,如果 n 非常大,那么串列將占用大量記憶體,
現在,我們使用 yield 關鍵字改寫這個函式,使其成為一個生成器:
點擊查看代碼
def create_numbers(n):
for i in range(n):
yield i
nums = create_numbers(5)
for num in nums:
print(num)
在這個版本的函式中,我們并沒有一次性創建一個完整的串列,相反,我們使用 yield 關鍵字,在每次迭代時生成下一個數字,這種方法對記憶體的利用更高效,因為我們并不需要在記憶體中一次性存盤所有的數字,無論 n 多大,這個生成器在任何時候都只會產生一個數字,
當你需要處理大量資料時,這種方式特別有用,它允許你創建一個不會因資料量太大而耗盡記憶體的資料流,這也是生成器與常規函式的主要區別,
4. 復雜的例子說明yeild 與普通函式的差異
下面讓我們使用一個更復雜的例子來說明 yield 和普通函式之間的差異,
假設我們要生成一個斐波那契數列,其中每個數字都是前兩個數字的和,假設我們要生成前 N 個斐波那契數,
以下是使用普通函式生成斐波那契數列的方法:
點擊查看代碼
def fibonacci(n):
nums = []
a, b = 0, 1
while len(nums) < n:
nums.append(b)
a, b = b, a + b
return nums
print(fibonacci(10)) # 輸出: [1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
這個函式會一次性生成所有的斐波那契數,并將它們存盤在一個串列中,這意味著所有的數都將同時存在于記憶體中,
現在,讓我們嘗試使用一個生成器來完成同樣的任務:
點擊查看代碼
def fibonacci(n):
yield 1
if n > 1:
a, b = 1, 1
while n > 1:
a, b = b, a + b
yield a
n -= 1
print(list(fibonacci(10))) # 輸出: [1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
這個生成器會一次生成一個斐波那契數,每次你從生成器請求一個數時,它都會計算出新的數并回傳,這意味著在任何時候,只有一個斐波那契數存在于記憶體中,
如果你要生成的斐波那契數非常多(例如,幾百萬個),那么生成器版本的函式將大大節省記憶體,此外,如果你只需要迭代而不需要所有的斐波那契數,那么使用生成器可以讓你的代碼更加高效,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/554477.html
標籤:其他
下一篇:返回列表