生成器表達式是 Python 中一種更簡潔的語法,專門用來創建生成器。它的語法與列表生成式類似,但將列表生成式中的方括號 []
替換為小括號 ()
。生成器表達式與生成器函數類似,具有「惰性評估」的特性,因此它只在需要時才生成元素,從而節省記憶體。
生成器的「惰性評估」(也叫延遲求值)指的是生成器不會一次性生成所有結果,而是按需生成,也就是當你需要一個值時,它才計算並返回這個值,而不會提前計算或佔用額外的記憶體。
動態產生值,並透過迭代器一次送出一個值,無法備份或重新啟動產生器。
(expression for item in iterable if condition)
expression
:表達式,表示生成的元素。item
:每次迭代的項目。iterable
:可迭代對象,例如列表、範圍等。condition
(可選):用於過濾條件。這裡我們生成 0 到 4 的平方:
gen = (i * 2 for i in range(5))
print(gen) # 這裡返回的是生成器對象
要取出生成器中的元素,可以使用 for
迴圈或者 next()
函數:
for value in gen:
print(value)
我們可以在生成器表達式中加入條件來過濾元素。下面例子只生成偶數的平方:
gen = (i ** 2 for i in range(10) if i % 2 == 0)
for value in gen:
print(value)
輸出:
0
4
16
36
64
使用生成器表達式可以更高效地處理大型數據集。以下是計算 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應用在影像讀取的好處