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

更新於 發佈於 閱讀時間約 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
留言分享你的想法!
小松鼠-avatar-img
2024/09/14
螃蟹中秋假期快樂~⭐🌕
螃蟹_crab-avatar-img
發文者
2024/09/14
小松鼠 中秋假期快樂:) 明天要開始跑行程了 ~
小松鼠-avatar-img
2024/09/14
yield, yield from 也很好用。 很喜歡python generator的這個feature,動態輸出變得很方便,又省空間。
avatar-img
螃蟹_crab的沙龍
148會員
255內容數
本業是影像辨識軟體開發,閒暇時間進修AI相關內容,將學習到的內容寫成文章分享。
螃蟹_crab的沙龍的其他內容
2025/04/25
在 Python 中,字典(dict)是非常常用的資料結構,用來儲存 key-value 配對。而在操作字典時,.setdefault() 是一個常被忽略但非常實用的方法。 這篇文章會完整介紹 .setdefault() 的語法、用途、與實務範例,幫助你更有效率地處理字典資料。 什麼是 .se
Thumbnail
2025/04/25
在 Python 中,字典(dict)是非常常用的資料結構,用來儲存 key-value 配對。而在操作字典時,.setdefault() 是一個常被忽略但非常實用的方法。 這篇文章會完整介紹 .setdefault() 的語法、用途、與實務範例,幫助你更有效率地處理字典資料。 什麼是 .se
Thumbnail
2025/01/30
Python 程式在電腦上的執行流程 當我們在電腦上執行 Python 程式時,主要經歷以下幾個步驟: 1. 編寫 Python 程式碼 開發者使用文字編輯器或 IDE(如 VS Code、PyCharm)撰寫 Python 程式,並將其存為 .py 檔案。 例如,一個簡單的 Python
Thumbnail
2025/01/30
Python 程式在電腦上的執行流程 當我們在電腦上執行 Python 程式時,主要經歷以下幾個步驟: 1. 編寫 Python 程式碼 開發者使用文字編輯器或 IDE(如 VS Code、PyCharm)撰寫 Python 程式,並將其存為 .py 檔案。 例如,一個簡單的 Python
Thumbnail
2024/10/17
在一個典型的程式專案中,UI、Controller 和 Main 的分工通常遵循 MVC 模型(Model-View-Controller) 的架構,這是一種常見的設計模式,能夠將應用程式的邏輯和界面進行分離。 大部分典型的程式專案設計: UI (View):專注於用戶界面,展示數據,並將用
Thumbnail
2024/10/17
在一個典型的程式專案中,UI、Controller 和 Main 的分工通常遵循 MVC 模型(Model-View-Controller) 的架構,這是一種常見的設計模式,能夠將應用程式的邏輯和界面進行分離。 大部分典型的程式專案設計: UI (View):專注於用戶界面,展示數據,並將用
Thumbnail
看更多
你可能也想看
Thumbnail
「欸!這是在哪裡買的?求連結 🥺」 誰叫你太有品味,一發就讓大家跟著剁手手? 讓你回購再回購的生活好物,是時候該介紹出場了吧! 「開箱你的美好生活」現正召喚各路好物的開箱使者 🤩
Thumbnail
「欸!這是在哪裡買的?求連結 🥺」 誰叫你太有品味,一發就讓大家跟著剁手手? 讓你回購再回購的生活好物,是時候該介紹出場了吧! 「開箱你的美好生活」現正召喚各路好物的開箱使者 🤩
Thumbnail
介紹朋友新開的蝦皮選物店『10樓2選物店』,並分享方格子與蝦皮合作的分潤計畫,註冊流程簡單,0成本、無綁約,推薦給想增加收入的讀者。
Thumbnail
介紹朋友新開的蝦皮選物店『10樓2選物店』,並分享方格子與蝦皮合作的分潤計畫,註冊流程簡單,0成本、無綁約,推薦給想增加收入的讀者。
Thumbnail
當你邊吃粽子邊看龍舟競賽直播的時候,可能會順道悼念一下2300多年前投江的屈原。但你知道端午節及其活動原先都與屈原毫無關係嗎?這是怎麼回事呢? 本文深入探討端午節設立初衷、粽子、龍舟競渡與屈原自沉四者。看完這篇文章,你就會對端午、粽子、龍舟和屈原的四角關係有新的認識喔。那就讓我們一起解開謎團吧!
Thumbnail
當你邊吃粽子邊看龍舟競賽直播的時候,可能會順道悼念一下2300多年前投江的屈原。但你知道端午節及其活動原先都與屈原毫無關係嗎?這是怎麼回事呢? 本文深入探討端午節設立初衷、粽子、龍舟競渡與屈原自沉四者。看完這篇文章,你就會對端午、粽子、龍舟和屈原的四角關係有新的認識喔。那就讓我們一起解開謎團吧!
Thumbnail
Array可以說是各種語言除了基本型別之外,最常用的資料型別與容器之一了。 Array 這種連續格子狀的資料結構,在Python要怎麼表達呢? 建立一個空的陣列 最簡單也最直接的寫法就是 array = [] # Python list [] 就對應到大家熟知的array 陣列型態的資料結
Thumbnail
Array可以說是各種語言除了基本型別之外,最常用的資料型別與容器之一了。 Array 這種連續格子狀的資料結構,在Python要怎麼表達呢? 建立一個空的陣列 最簡單也最直接的寫法就是 array = [] # Python list [] 就對應到大家熟知的array 陣列型態的資料結
Thumbnail
實作密碼產生器 請使用者輸入要產生幾位數的密碼長度 依據使用者輸入的密碼長度,輸出密碼 import random import string 數字 = string.digits 英文 = string.ascii_letters 字母表 = 數字 + 英文 # 0123456789abc
Thumbnail
實作密碼產生器 請使用者輸入要產生幾位數的密碼長度 依據使用者輸入的密碼長度,輸出密碼 import random import string 數字 = string.digits 英文 = string.ascii_letters 字母表 = 數字 + 英文 # 0123456789abc
Thumbnail
List 清單 和 Tuple元組 清單在Python裡面非常的常用,大家一定要熟練這些基礎的元素。 在Python中,列表(List)是一種常用的資料類型,用於儲存一組有序的元素。列表是可變的(Mutable),這意味著你可以在列表中新增、刪除和修改元素。列表使用方括號 []
Thumbnail
List 清單 和 Tuple元組 清單在Python裡面非常的常用,大家一定要熟練這些基礎的元素。 在Python中,列表(List)是一種常用的資料類型,用於儲存一組有序的元素。列表是可變的(Mutable),這意味著你可以在列表中新增、刪除和修改元素。列表使用方括號 []
Thumbnail
sort reverse count index copy len min max sum any all
Thumbnail
sort reverse count index copy len min max sum any all
Thumbnail
以一個雜魚測試工程師的角度來看int應用場景
Thumbnail
以一個雜魚測試工程師的角度來看int應用場景
Thumbnail
Hi,大家好。我是茶桁。 最近几节课,我们都是在详细讲解Python内的数据类型,上一节课我们详细了解了字符串,这节课,让我们来详解一下列表。 首先,我们先有一个大的概念,列表,其实就是一组有序的数据组合;另外,列表中的数据是可以被修改的。也就是说,列表是一个可变序列类型。 列表定义 如何在
Thumbnail
Hi,大家好。我是茶桁。 最近几节课,我们都是在详细讲解Python内的数据类型,上一节课我们详细了解了字符串,这节课,让我们来详解一下列表。 首先,我们先有一个大的概念,列表,其实就是一组有序的数据组合;另外,列表中的数据是可以被修改的。也就是说,列表是一个可变序列类型。 列表定义 如何在
Thumbnail
Hi,大家好。我是茶桁。 在前面几节课的基础之上,我们今天开始尝试在Python中控制流程。这中间,让我们来做一些实际的练习。 Python语句的分类 让我们先了解一下Python语句的分类。 在Python中,可分为单行代码和代码块/组, 顾名思义,单行代码就是一行的Python代码,而代
Thumbnail
Hi,大家好。我是茶桁。 在前面几节课的基础之上,我们今天开始尝试在Python中控制流程。这中间,让我们来做一些实际的练习。 Python语句的分类 让我们先了解一下Python语句的分类。 在Python中,可分为单行代码和代码块/组, 顾名思义,单行代码就是一行的Python代码,而代
Thumbnail
Python的random模組是一個非常實用的工具,可以讓我們在程式中生成隨機數或從序列中隨機選擇元素。下面介紹一些常用的random模組函數。 首先,我們需要導入random模組,可以使用以下語句進行導入: 接下來,我們來看看random模組中的一些基本函數: random.random()
Thumbnail
Python的random模組是一個非常實用的工具,可以讓我們在程式中生成隨機數或從序列中隨機選擇元素。下面介紹一些常用的random模組函數。 首先,我們需要導入random模組,可以使用以下語句進行導入: 接下來,我們來看看random模組中的一些基本函數: random.random()
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News