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 的代码。
扩展: