1. 什么是可迭代对象 (Iterable)
在 Python 里,可迭代对象 指的是:
👉 能够一次返回一个元素的对象,可以被 for
循环遍历。
常见的可迭代对象有:
- 序列类型 :
list
、tuple
、str
- 集合类型 :
set
、dict
(遍历的是 key) - 文件对象:逐行读取
- 生成器 、迭代器
判断一个对象是否可迭代:
python
from collections.abc import Iterable
print(isinstance([1,2,3], Iterable)) # True
print(isinstance(123, Iterable)) # False
2. 可迭代对象和迭代器的区别
很多初学者会混淆 Iterable 和 Iterator。
- Iterable(可迭代对象) :能返回迭代器的对象,例如
list
、dict
、str
。 - Iterator(迭代器) :是一个对象,表示一个数据流,可以用
next()
不断取值。
python
from collections.abc import Iterator
lst = [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)不会一次性生成所有数据,而是按需计算。
例如:
python
nums = [i for i in range(5)] # 列表推导式(消耗内存存储所有元素)
gen = (i for i in range(5)) # 生成器(惰性计算)
4. for 循环背后的原理
当你写:
python
for x in [1, 2, 3]:
print(x)
Python 背后做的事情是:
python
it = iter([1, 2, 3]) # 先获取迭代器
while True:
try:
x = next(it)
print(x)
except StopIteration:
break
5. 自定义可迭代对象
你也可以让自己的类变成可迭代的,只要实现 __iter__()
方法,并返回一个迭代器。
示例:
python
class MyRange:
def __init__(self, n):
self.n = n
def __iter__(self): # 返回一个迭代器
return MyRangeIterator(self.n)
class MyRangeIterator:
def __init__(self, n):
self.current = 0
self.n = n
def __iter__(self): # 迭代器也要有 __iter__()
return self
def __next__(self): # 定义迭代规则
if self.current < self.n:
val = self.current
self.current += 1
return val
else:
raise StopIteration
for i in MyRange(5):
print(i)
输出:
0
1
2
3
4
6. 总结
- 可迭代对象 :能返回迭代器(
list
、tuple
、dict
、set
、str
、文件等)。 - 迭代器 :可以
next()
取值,直到取尽(惰性计算,节省内存)。 for ... in ...
背后其实就是iter()
+next()
。- 你可以自定义可迭代对象,掌握迭代协议能让你写出更 Pythonic 的代码。
扩展: