在Python中,迭代器是一种可以逐个返回序列中元素的对象。它能够让我们使用如for
循环或next()
函数一项项地遍历数据,而无需一次性加载所有数据。本文将讲解什么是迭代器、可迭代对象,并展示如何自定义一个迭代器类。
1. 迭代器 vs. 可迭代对象
像列表、元组、字典、集合、字符串等,这些都属于可迭代对象(Iterable)。可迭代对象含有一个__iter__()
方法(或实现了类似协议),我们可以通过iter()
函数获取到它的迭代器。
fruits = ["apple", "banana", "cherry"]
myit = iter(fruits)
print(next(myit)) # apple
print(next(myit)) # banana
print(next(myit)) # cherry
这里myit
就是一个迭代器(Iterator),每次调用next(myit)
返回一个元素,直到没有元素可返回时会抛出StopIteration
异常。
2. for循环与可迭代对象
当我们写for x in fruits:
时,实质上是for
循环在背后调用iter(fruits)
生成迭代器,再不断用next()
取值,因此你可以遍历列表、字符串或其他可迭代对象。
for x in "banana":
print(x)
3. 自定义迭代器
如果想让某个类的对象具备“可以一项一项返回数据”的能力,只需在类中定义__iter__()
和__next__()
方法。
class MyNumbers:
def __iter__(self):
self.a = 1
return self
def __next__(self):
x = self.a
self.a += 1
return x
myclass = MyNumbers()
myit = iter(myclass)
print(next(myit)) # 1
print(next(myit)) # 2
print(next(myit)) # 3
以上示例中,__iter__()
在对象初始化后返回自身(self
),__next__()
则定义了每次取值返回什么。这样就构成了一个最基本的迭代器。
4. 防止无限循环:StopIteration
如果不加控制,__next__()
方法就会一直返回新的值,造成无限循环。通常我们会在__next__()
里设置终止条件,超过范围后用raise StopIteration
主动抛出异常,告诉Python “迭代结束”。
class MyNumbers:
def __iter__(self):
self.a = 1
return self
def __next__(self):
if self.a <= 5:
x = self.a
self.a += 1
return x
else:
raise StopIteration
myclass = MyNumbers()
for num in myclass:
print(num)
# 输出:
# 1
# 2
# 3
# 4
# 5
5. 总结
- 可迭代对象(Iterable):如列表、元组、集合、字符串等,都可以被
for
循环遍历。 - 迭代器(Iterator):实现
__iter__()
和__next__()
方法,可逐个返回元素。 - for循环实质上会自动调用迭代器的
next()
,直至StopIteration
。 - 自定义迭代器:为自己的类添加
__iter__()
和__next__()
,并在合适时raise StopIteration
。
了解并使用迭代器,可在处理大量数据或需要懒加载(lazy loading)时提高效率,也能让自定义对象像序列那样被遍历,带来更多灵活性。