目錄
1.可迭代對象 (Iterable)
2.迭代器 (Iterator)
3.生成器 (Generator)
3.1生成器函數 vs 生成器表達式
4.三者之間的聯系與區別
5.關系圖(幫助你一眼看懂)
6.核心結論(記住這三句話)
1.可迭代對象 (Iterable)
定義:
實現了 __iter__()
方法的對象,可以被 iter()
轉換成迭代器。
特點:
- 只能通過
iter()
生成迭代器,不能直接next()
。 - 常見例子:
list
、tuple
、str
、dict
、set
、range
。 for
循環背后就是在調用iter()
得到迭代器,然后不斷next()
。
示例:
nums = [1, 2, 3] # list 是可迭代對象
it = iter(nums) # 調用 __iter__ 得到迭代器
print(next(it)) # 1
2.迭代器 (Iterator)
定義:
同時實現了 __iter__()
和 __next__()
方法的對象。
特點:
- 可以直接用
next()
獲取下一個值。 - 取盡所有元素后,會拋出
StopIteration
。 - 迭代器本身也是可迭代對象(它的
__iter__()
返回自己)。 - 可以通過
iter()
從可迭代對象獲得迭代器,或者手寫迭代器類。
示例:
# 從可迭代對象得到迭代器
it = iter([1, 2, 3])
print(next(it)) # 1# 手寫迭代器類
class MyIterator:def __init__(self):self.n = 0def __iter__(self):return selfdef __next__(self):if self.n < 3:value = self.nself.n += 1return valueelse:raise StopIterationit2 = MyIterator()
print(next(it2)) # 0
3.生成器 (Generator)
定義:
一種特殊的迭代器,通過 函數 + yield
創建,Python 自動幫我們實現 __iter__()
和 __next__()
。
特點:
- 生成器對象既是迭代器,也是可迭代對象。
- 每次執行到
yield
暫停,返回值,下次從暫停處繼續執行。 - 自動處理狀態保存和
StopIteration
,寫起來更簡潔。
示例:
def my_gen():yield 0yield 1yield 2gen = my_gen() # 直接就是迭代器
print(next(gen)) # 0
print(next(gen)) # 1
3.1生成器函數 vs 生成器表達式
對比點 | 生成器函數 | 生成器表達式 |
定義方式 |
| 圓括號 |
代碼結構 | 支持多行、復雜邏輯 | 一行表達式,簡潔 |
可讀性 | 更適合復雜邏輯 | 更適合簡單邏輯 |
可傳參 | 可以通過調用函數傳入參數 | 參數一般在表達式里定義 |
返回值 | 返回生成器對象 | 返回生成器對象 |
它們的聯系:
- 本質相同:兩者返回的都是生成器對象,本質上都是迭代器。
- 使用方式相同:都可以用
next()
、for
循環來取值。 - 選擇依據:
-
- 如果邏輯簡單,用生成器表達式。
- 如果邏輯復雜(需要多行代碼、條件分支等),用生成器函數。
4.三者之間的聯系與區別
特性 | 可迭代對象 (Iterable) | 迭代器 (Iterator) | 生成器 (Generator) |
| ?有 | 有 | 自動實現 |
| 沒有 | 有 | 自動實現 |
是否可直接 | ?否 | 是 | 是 |
狀態保存 | 不保存 | 手動維護 | 自動維護 |
停止迭代方式 | 需先轉迭代器再判斷 | 手動拋 | 自動拋出 |
創建方式 | list、tuple 等內置類型 | 手寫類 or | 函數+ |
5.關系圖(幫助你一眼看懂)
可迭代對象 (Iterable)
│ 有 __iter__()
▼
iter() 函數
▼
迭代器 (Iterator)
│ 有 __iter__() 和 __next__()
│ 可用 next() 獲取值
│
└─> 生成器 (Generator) 是一種特殊的迭代器
(自動實現 __iter__ 和 __next__)
6.核心結論(記住這三句話)
- 可迭代對象:有
__iter__
,不能直接next()
,要先用iter()
轉換。 - 迭代器:有
__iter__
+__next__
,能直接next()
,可以手寫也可以用iter()
獲得。 - 生成器:就是“自動實現了迭代器協議”的函數產物,寫起來更簡潔。
這樣梳理之后,你會發現:
- 生成器 = 自動實現的迭代器
- 迭代器 = 可以手寫,也可以由
iter()
或生成器自動得到 - 可迭代對象 = 可以轉換成迭代器的對象