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

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

生成器表達式是 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) # 這裡返回的是生成器對象
raw-image

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

for value in gen:
print(value)
raw-image

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

raw-image

範例 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)

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

raw-image

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


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


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

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


參考文獻


avatar-img
128會員
209內容數
本業是影像辨識軟體開發,閒暇時間進修AI相關內容,將學習到的內容寫成文章分享。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
螃蟹_crab的沙龍 的其他內容
包含著日期型資料在許多不同領域的分析中都非常重要,特別是當數據涉及隨時間變化的趨勢、模式或週期時,例如房價,股票價格分析等等。 如何將一個日期欄位改為 DataFrame 的索引,你可以使用 set_index() 方法。 實作範例數據來源 處理步驟 確保日期欄位是 datetime
為了讓資料更適合進行後續的分析、建立模型,模型的決策準確性,資料探索與清理是資料分析過程中非常重要的步驟,主要目的在於確保資料的品質和可靠性。 因為前幾篇的例子中的資料,並沒有缺失值與重複值的部分,我另外找了一份有包含的資料來做案例分析,由於找到的資料沒有重複值的部分,故本文主要解釋處理缺失值的部
接續上一篇文章,使用kaggle平台上的數據資料來實作說明。 [Python ]pandas基本操作,查看、新增、修改資料 用 pandas (pd) 來畫圖了解 MentalHealthSurvey 資料結構,圖表可以幫助你直觀地瞭解 MentalHealthSurvey 資料的結構和變數
本文主要介紹如何使用pandas來查看、新增、修改資料。 [Python ]pandas讀取寫入CSV 與Excel文件 [Python ]資料分析工具pandas基礎介紹 本文將使用kaggle平台上的數據資料來實作說明。 基本操作 查看資料 df.head():顯示前5行數據。
在 Python 中,可以使用多種方法來去除字串中的空白字元,以下是幾種常見的方法: 固定位置型 使用 strip() 方法 strip() 方法會去除字串前後的空白字元(包括空格、換行、製表符號等)。
有別於正則表達式符號的難以理解,有其他簡單的方式也可以來處理字串的問題。 本文主要介紹其他方法用於處理字串,尋找字串中的關鍵字與其他操作。 [Python]Re正則表達式中常用符號的重點整理 字串方法(String Methods) Python 提供了多種內建的字串方法,可以替代某些簡單
包含著日期型資料在許多不同領域的分析中都非常重要,特別是當數據涉及隨時間變化的趨勢、模式或週期時,例如房價,股票價格分析等等。 如何將一個日期欄位改為 DataFrame 的索引,你可以使用 set_index() 方法。 實作範例數據來源 處理步驟 確保日期欄位是 datetime
為了讓資料更適合進行後續的分析、建立模型,模型的決策準確性,資料探索與清理是資料分析過程中非常重要的步驟,主要目的在於確保資料的品質和可靠性。 因為前幾篇的例子中的資料,並沒有缺失值與重複值的部分,我另外找了一份有包含的資料來做案例分析,由於找到的資料沒有重複值的部分,故本文主要解釋處理缺失值的部
接續上一篇文章,使用kaggle平台上的數據資料來實作說明。 [Python ]pandas基本操作,查看、新增、修改資料 用 pandas (pd) 來畫圖了解 MentalHealthSurvey 資料結構,圖表可以幫助你直觀地瞭解 MentalHealthSurvey 資料的結構和變數
本文主要介紹如何使用pandas來查看、新增、修改資料。 [Python ]pandas讀取寫入CSV 與Excel文件 [Python ]資料分析工具pandas基礎介紹 本文將使用kaggle平台上的數據資料來實作說明。 基本操作 查看資料 df.head():顯示前5行數據。
在 Python 中,可以使用多種方法來去除字串中的空白字元,以下是幾種常見的方法: 固定位置型 使用 strip() 方法 strip() 方法會去除字串前後的空白字元(包括空格、換行、製表符號等)。
有別於正則表達式符號的難以理解,有其他簡單的方式也可以來處理字串的問題。 本文主要介紹其他方法用於處理字串,尋找字串中的關鍵字與其他操作。 [Python]Re正則表達式中常用符號的重點整理 字串方法(String Methods) Python 提供了多種內建的字串方法,可以替代某些簡單
你可能也想看
Google News 追蹤
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
上兩篇有關List的文章,此篇文上兩章的延續,整理一些常用的方法和操作。 [Python]List(列表)新增、修改、刪除元素 [Python基礎]容器 list(列表),tuple(元組) 還有一些常用的 list 方法和操作,讓你能更靈活地處理列表數據
Thumbnail
在 Python 中,print( ) 函數用於將結果輸出到螢幕上。當你嘗試將不同資料型別(例如字串和數字)混合在一起輸出時,print( )函數無法直接處理這些不同型別的資料,因此你需要先將它們轉換為相同的資料型別。通常,這意味著需要將數字轉換為字串型別,以便與其他字串一同輸出。 雖然我們也可以
Thumbnail
先前我們談論到靜態方法就像是定義工具箱一樣,那麼抽象方法就像是共用表格的概念,例如註冊帳號時會填寫的一些基本資料,就有包含制式的表格,裡面有需填寫的欄位,例如姓名,性別等。
Thumbnail
先前學到自定函式的使用方法,那如果在一個很龐大的程式架構中發散了一推自定函式,有沒有辦法可以整理一下,讓程式結構整齊又簡潔呢? 可以使用裝飾器staticmethod 定義靜態方法,全部整理到一個類別去,想像成是一個工具箱的概念,工具箱就是類別,靜態方法就像是裡面的工具一樣。
Thumbnail
在Python函式中,可以使用None來指定動態的預設引數,使用更靈活,Docstrings同時能夠提供清晰的文檔。本篇文章說明利用這種方式來讓函式更彈性,輸入不同型態的關鍵字引數,並在事件紀錄時間的Log訊息的範例中詮釋,可自行輸入時間或者預設導入系統的時間,在跟其他程式交握時,可以更靈活的應用。
Thumbnail
本文介紹了Python中函式引數的*args和**kwargs用法,通過*args處理可變數量的位置引數,通過**kwargs處理可變數量的關鍵字引數。不僅介紹了相應的語法和程式範例,還解釋了它們的順序問題和建議的慣例用法。
Thumbnail
本文介紹了串列運算式的應用,以及與Lambda匿名函式方法的比較,並提供了程式範例。串列運算式提供了一種簡潔的語法,用於創建、轉換和過濾列表。lambda函式用於創建匿名函式,通常用於簡單的操作。建議在比較複雜的情況下使用一般for迴圈加if來表示。
Thumbnail
如果我只是想要重複做一些很簡單的運算,還有沒有更簡潔的方式,那就是Lambda匿名函式。 本文將介紹 : Lambda匿名函式的用法,也比較跟自定函式的差異之處。 結合map,filter,sorted函式做應用介紹
Thumbnail
本文將介紹自定函式及應用,利用程式範例解釋為什麼要用到自定函式 自定函式好處當然就是,讓你的程式碼看起來比較簡潔,在重複使用到的程式碼區塊,可以包裝成函式,讓你重複使用它。
Thumbnail
Python 產生器(Generator)是一種特殊的迭代器,能夠以更有效率的方式處理大量數據。本文將介紹產生器的基礎概念、使用方法,並提供實際應用範例
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
上兩篇有關List的文章,此篇文上兩章的延續,整理一些常用的方法和操作。 [Python]List(列表)新增、修改、刪除元素 [Python基礎]容器 list(列表),tuple(元組) 還有一些常用的 list 方法和操作,讓你能更靈活地處理列表數據
Thumbnail
在 Python 中,print( ) 函數用於將結果輸出到螢幕上。當你嘗試將不同資料型別(例如字串和數字)混合在一起輸出時,print( )函數無法直接處理這些不同型別的資料,因此你需要先將它們轉換為相同的資料型別。通常,這意味著需要將數字轉換為字串型別,以便與其他字串一同輸出。 雖然我們也可以
Thumbnail
先前我們談論到靜態方法就像是定義工具箱一樣,那麼抽象方法就像是共用表格的概念,例如註冊帳號時會填寫的一些基本資料,就有包含制式的表格,裡面有需填寫的欄位,例如姓名,性別等。
Thumbnail
先前學到自定函式的使用方法,那如果在一個很龐大的程式架構中發散了一推自定函式,有沒有辦法可以整理一下,讓程式結構整齊又簡潔呢? 可以使用裝飾器staticmethod 定義靜態方法,全部整理到一個類別去,想像成是一個工具箱的概念,工具箱就是類別,靜態方法就像是裡面的工具一樣。
Thumbnail
在Python函式中,可以使用None來指定動態的預設引數,使用更靈活,Docstrings同時能夠提供清晰的文檔。本篇文章說明利用這種方式來讓函式更彈性,輸入不同型態的關鍵字引數,並在事件紀錄時間的Log訊息的範例中詮釋,可自行輸入時間或者預設導入系統的時間,在跟其他程式交握時,可以更靈活的應用。
Thumbnail
本文介紹了Python中函式引數的*args和**kwargs用法,通過*args處理可變數量的位置引數,通過**kwargs處理可變數量的關鍵字引數。不僅介紹了相應的語法和程式範例,還解釋了它們的順序問題和建議的慣例用法。
Thumbnail
本文介紹了串列運算式的應用,以及與Lambda匿名函式方法的比較,並提供了程式範例。串列運算式提供了一種簡潔的語法,用於創建、轉換和過濾列表。lambda函式用於創建匿名函式,通常用於簡單的操作。建議在比較複雜的情況下使用一般for迴圈加if來表示。
Thumbnail
如果我只是想要重複做一些很簡單的運算,還有沒有更簡潔的方式,那就是Lambda匿名函式。 本文將介紹 : Lambda匿名函式的用法,也比較跟自定函式的差異之處。 結合map,filter,sorted函式做應用介紹
Thumbnail
本文將介紹自定函式及應用,利用程式範例解釋為什麼要用到自定函式 自定函式好處當然就是,讓你的程式碼看起來比較簡潔,在重複使用到的程式碼區塊,可以包裝成函式,讓你重複使用它。
Thumbnail
Python 產生器(Generator)是一種特殊的迭代器,能夠以更有效率的方式處理大量數據。本文將介紹產生器的基礎概念、使用方法,並提供實際應用範例