生成器表達式是 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][OpenCV]使用yield應用在影像讀取的好處