更新於 2024/09/16閱讀時間約 1 分鐘

[Python]生成器表達式(Generator Expression)介紹

生成器表達式是 Python 中一種更簡潔的語法,專門用來創建生成器。它的語法與列表生成式類似,但將列表生成式中的方括號 [] 替換為小括號 ()。生成器表達式與生成器函數類似,具有「惰性評估」的特性,因此它只在需要時才生成元素,從而節省記憶體。

生成器的「惰性評估」(也叫延遲求值)指的是生成器不會一次性生成所有結果,而是按需生成,也就是當你需要一個值時,它才計算並返回這個值,而不會提前計算或佔用額外的記憶體。

動態產生值,並透過迭代器一次送出一個值,無法備份或重新啟動產生器。


生成器表達式的語法

(expression for item in iterable if condition)
  • expression:表達式,表示生成的元素。
  • item:每次迭代的項目。
  • iterable:可迭代對象,例如列表、範圍等。
  • condition(可選):用於過濾條件。

生成器表達式

範例 1:基本生成器表達式

這裡我們生成 0 到 4 的平方:

gen = (i * 2 for i in range(5))
print(gen) # 這裡返回的是生成器對象

要取出生成器中的元素,可以使用 for 迴圈或者 next() 函數:

for value in gen:
print(value)

但只能取一次,若在取就取不出東西

範例 2:帶條件的生成器表達式

我們可以在生成器表達式中加入條件來過濾元素。下面例子只生成偶數的平方:

gen = (i ** 2 for i in range(10) if i % 2 == 0)
for value in gen:
print(value)

輸出:

0
4
16
36
64

範例 3:計算數字總和

使用生成器表達式可以更高效地處理大型數據集。以下是計算 100 萬個數字總和的例子,使用生成器表達式比列表生成式更節省記憶體:

gen = (i for i in range(10**6))
total = sum(gen)
print(total)

輸出:

499999500000

這裡的 sum() 函數使用生成器表達式進行計算,因為生成器按需產生數字,所以節省了大量記憶體。


使用生成器表達式的優點

因為生成器不會將所有數據一次性載入到記憶體,當處理大數據集時,它可以顯著減少記憶體使用量。

程式範例

  • 當你使用列表生成式時,例如:
    a = [i for i in range(10**7)]
    這個列表會一次性在記憶體中生成 1000 萬個數字。這會立即佔用大量的記憶體。
  • 而當你使用生成器時,例如:
    a = (i for i in range(10**7))
    生成器不會立即生成這 1000 萬個數字,它只在每次需要數字時(例如透過迴圈遍歷)才生成下一個數字。這樣的方式讓程式在需要時才計算數據,從而減少了記憶體的使用,因為它不會同時在記憶體中儲存所有數據。

例子

假設你有以下的兩段程式碼來處理 1000 萬個元素:

列表版本:

a = [i for i in range(10**7)]  # 一次性生成1000萬個數字,佔用大量記憶體
for i in a:
print(i)

這個程式會在執行 range(10**7) 時一次性生成 1000 萬個數字,將它們存放在列表 a 中,然後再進行迴圈處理。這樣需要預先佔用大量記憶體。

生成器版本:

a = (i for i in range(10**7))  # 使用生成器,不會一次性生成全部數字
for i in a:
print(i)

在這個程式中,生成器會逐步生成數字,每次只在需要時生成下一個數字,從而大幅減少記憶體消耗。當你進行迴圈遍歷時,生成器會計算並返回下一個值,而不是一次性生成所有結果。

謝謝大家觀看,若喜歡的話,希望可以追蹤,點愛心給予鼓勵


其他生成器表達式相關文章


[Python]生成器表達式過濾多層的列表中的空值

[Python][OpenCV]使用yield應用在影像讀取的好處


參考文獻


分享至
成為作者繼續創作的動力吧!
© 2024 vocus All rights reserved.