1. 什么是可迭代對象 (Iterable)
在 Python 里,可迭代對象指的是:
👉 能夠一次返回一個元素的對象,可以被 for
循環遍歷。
常見的可迭代對象有:
- 序列類型:
list
、tuple
、str
- 集合類型:
set
、dict
(遍歷的是 key) - 文件對象:逐行讀取
- 生成器、迭代器
判斷一個對象是否可迭代:
from collections.abc import Iterableprint(isinstance([1,2,3], Iterable)) # True
print(isinstance(123, Iterable)) # False
2. 可迭代對象和迭代器的區別
很多初學者會混淆 Iterable 和 Iterator。
- Iterable(可迭代對象):能返回迭代器的對象,例如
list
、dict
、str
。 - Iterator(迭代器):是一個對象,表示一個數據流,可以用
next()
不斷取值。
from collections.abc import Iteratorlst = [1, 2, 3]print(isinstance(lst, Iterator)) # False (只是可迭代,還不是迭代器)
it = iter(lst) # 用 iter() 轉換為迭代器
print(isinstance(it, Iterator)) # True
print(next(it)) # 1
print(next(it)) # 2
總結:
- Iterable 可以通過
iter()
得到 Iterator。 - Iterator 可以通過
next()
逐個取值,直到StopIteration
。
3. 為什么需要可迭代對象?
原因:
- Python 內部很多語法(如
for ... in ...
、列表推導式、解包)都依賴 迭代協議。 - 節省內存,比如生成器(generator)不會一次性生成所有數據,而是按需計算。
例如:
nums = [i for i in range(5)] # 列表推導式(消耗內存存儲所有元素)
gen = (i for i in range(5)) # 生成器(惰性計算)
4. for 循環背后的原理
當你寫:
for x in [1, 2, 3]:print(x)
Python 背后做的事情是:
it = iter([1, 2, 3]) # 先獲取迭代器
while True:try:x = next(it)print(x)except StopIteration:break
5. 自定義可迭代對象
你也可以讓自己的類變成可迭代的,只要實現 __iter__()
方法,并返回一個迭代器。
示例:
class MyRange:def __init__(self, n):self.n = ndef __iter__(self): # 返回一個迭代器return MyRangeIterator(self.n)class MyRangeIterator:def __init__(self, n):self.current = 0self.n = ndef __iter__(self): # 迭代器也要有 __iter__()return selfdef __next__(self): # 定義迭代規則if self.current < self.n:val = self.currentself.current += 1return valelse:raise StopIterationfor i in MyRange(5):print(i)
輸出:
0
1
2
3
4
6. 總結
- 可迭代對象:能返回迭代器(
list
、tuple
、dict
、set
、str
、文件等)。 - 迭代器:可以
next()
取值,直到取盡(惰性計算,節省內存)。 for ... in ...
背后其實就是iter()
+next()
。- 你可以自定義可迭代對象,掌握迭代協議能讓你寫出更 Pythonic 的代碼。
擴展: