Python 的迭代器协议是用来实现对象迭代的一种约定或协议。按照迭代器协议,一个对象要实现两个方法:__iter__()
和 __next__()
。
迭代器协议的核心概念
-
可迭代对象 (Iterable)
- 一个对象只要实现了
__iter__()
方法,并且该方法返回一个迭代器(即实现了__next__()
方法的对象),这个对象就被称为可迭代对象。 - 常见的可迭代对象包括列表、元组、字典、集合和字符串。
- 一个对象只要实现了
-
迭代器 (Iterator)
- 迭代器是一个实现了
__next__()
方法的对象。每次调用__next__()
方法都会返回序列中的下一个元素,如果序列已经被完全迭代,则会引发StopIteration
异常。 - 迭代器还需要实现
__iter__()
方法,并且该方法返回迭代器自身。
- 迭代器是一个实现了
迭代器协议示例
下面是一个简单的示例,展示如何实现一个可迭代对象和迭代器:
class MyIterator:
def __init__(self, data):
self.data = data
self.index = 0
def __iter__(self):
return self
def __next__(self):
if self.index < len(self.data):
result = self.data[self.index]
self.index += 1
return result
else:
raise StopIteration
class MyIterable:
def __init__(self, data):
self.data = data
def __iter__(self):
return MyIterator(self.data)
# 使用 MyIterable
my_iterable = MyIterable([1, 2, 3, 4, 5])
for item in my_iterable:
print(item)
解释
-
MyIterator 类:实现了
__iter__()
和__next__()
方法。__iter__()
返回自身,使其成为一个迭代器。__next__()
方法在每次调用时返回数据的下一个元素,当没有更多元素时,抛出StopIteration
异常。
-
MyIterable 类:实现了
__iter__()
方法。__iter__()
返回一个MyIterator
对象,使MyIterable
成为一个可迭代对象。
内置的可迭代对象和迭代器
Python 内置的许多对象都实现了迭代器协议,例如列表、字典、集合等。你可以使用 iter()
函数将这些对象转换为迭代器,并使用 next()
函数获取下一个元素:
my_list = [1, 2, 3]
iterator = iter(my_list)
print(next(iterator)) # 输出: 1
print(next(iterator)) # 输出: 2
print(next(iterator)) # 输出: 3
# 如果再调用一次 next(iterator),会引发 StopIteration 异常
通过理解和实现迭代器协议,你可以自定义复杂的迭代行为,并充分利用 Python 的迭代特性。