
這篇筆記主要是介紹資料科學家的好朋友:迭代器和生成器!
迭代器與生成器是大家在處理資料以及訓練模型時常常會使用到的工具,請務必熟悉他們的用法!!!
🔄 迭代器
可迭帶物件與iter()
、next()
- 可迭代物件是可以逐一取出其元素的物件,例如列表(List)、元組(Tuple)、字典(Dictionary)、字串(Sting)等。
- 檢查是否可迭代:可以使用
iter()
函數將可迭代物件轉為迭代器。
迭代器 (Iterator)
- 迭代器是支持
next()
方法的物件,可以逐步返回序列的下一個元素,耗盡後會引發StopIteration
例外。 - 特性:
- 迭代器是一種一次性資源(元素只能被取出一次)。
- 可通過 next() 逐步獲取值。
基礎迭代器
# 建立一個可迭代物件(如列表)
numbers = [1, 2, 3]
# 將可迭代物件轉換成迭代器
iterator = iter(numbers)
# 使用 next() 逐一獲取元素
print(next(iterator)) # 1
print(next(iterator)) # 2
print(next(iterator)) # 3
# 當迭代耗盡時,會引發 StopIteration
try:
print(next(iterator))
except StopIteration:
print("No more elements!")
# 輸出
1
2
3
No more elements!
檢查物件是否為迭代器
from collections.abc import Iterator
# 檢查是否為迭代器
numbers = [1, 2, 3]
iterator = iter(numbers)
print(isinstance(numbers, Iterator)) # False (列表不是迭代器)
print(isinstance(iterator, Iterator)) # True (經 iter() 轉換後是迭代器)
自定義迭代器類別
class MyIterator:
def __init__(self, data):
self.data = data
self.index = 0
def __iter__(self):
return self
def __next__(self):
if self.index < len(self.data):
value = self.data[self.index]
self.index += 1
return value
else:
raise StopIteration
numbers = MyIterator([1, 2, 3])
for num in numbers:
print(num)
# 輸出
1
2
3
📔 生成器 (Generator)
- 生成器是特殊的函數,能夠暫停執行並返回值,稍後可從暫停處繼續執行。
- 透過 yield 產生值: 使用 yield 關鍵字替代 return,生成器會記住停留的位置。
def count_up_to(maximum):
count = 1
while count <= maximum:
yield count # 暫停並返回 count
count += 1
# 使用生成器
counter = count_up_to(3)
print(next(counter)) # 1
print(next(counter)) # 2
print(next(counter)) # 3
# 當生成器耗盡時,會引發 StopIteration
try:
print(next(counter))
except StopIteration:
print("Generator is exhausted!")
# 輸出
1
2
3
Generator is exhausted!
生成器表達式
生成器表達式是生成器的一種簡化語法,使用括號 () 定義,類似串列生成式的用法。
# 使用生成器表達式創建生成器
numbers = (x*x for x in range(5))
# 使用迭代器獲取生成結果
print(next(numbers)) # 0
print(next(numbers)) # 1
print(next(numbers)) # 4
🎰 迭代器 vs 生成器
在資料科學的領域中,我們常常需要處理大量的資料,不論是結構型資料(Excel形式的表格資料)或是非結構型資料(圖片、文字、語音等),這些資料在存取和運算的過程中都會占用非常多的記憶體容量(RAM)。藉由善用迭代器和生成器可以讓我們以更有效率的方式來處理這些資料,也能避免記憶體被塞滿或是不足的問題。
初學者很難搞懂究竟什麼時候用迭代器,什麼時候用生成器,初學階段可以先不管,只要知道在處理資料可以使用這兩種方法進行資料的讀取,盡量避免將全部資料一次性讀取的作法,尤其是在非結構性資料的任務上。
💡因此迭代器和生成器是大家在資料科學這條路上不可或缺的技術之一。

迭代器適合情境:
- 已有集合或順序數據結構的逐步遍歷。
- 需要自定義細節更精確的邏輯(例如,特定條件下停止迭代)。
生成器適合情境:
- 動態生成數據(如大數據流或無限序列),節省內存。
- 簡化代碼邏輯,計算延遲執行。
💡迭代器更加底層,適合自定義對象的迭代邏輯;生成器更高效簡潔,適合動態生成數據的應用。