Python 迭代器(iterator)
什么是迭代器
在 Python 中,迭代器是一个对象,它实现了迭代协议。迭代协议是指包含 __iter__
和 __next__
方法的对象。其中,__iter__
返回迭代器自身,并且在迭代序列之后可以再次重复遍历。__next__
返回序列的下一个值。如果没有更多的项可返回,则抛出 StopIteration
异常。
简而言之,迭代器是一个可以按需生成值的对象。它会在每次请求时计算并返回下一个值,直到没有更多的值可供返回。
迭代器的基本用法
要创建一个迭代器,我们可以使用 iter()
和 next()
函数。下面是一个简单的示例:
my_tuple = ("apple", "banana", "cherry")
my_iter = iter(my_tuple)
print(next(my_iter)) # 输出:apple
print(next(my_iter)) # 输出:banana
print(next(my_iter)) # 输出:cherry
在上面的示例中,iter()
函数将一个可迭代对象转换为迭代器。然后,我们使用 next()
函数获取序列的下一个值。
在 next()
函数调用之后,迭代器会记住它在序列中的位置,并等待下一次调用。如果没有更多的值,next()
函数会引发 StopIteration
异常。
创建自定义迭代器
如果我们希望创建自定义的迭代器,需要在对象中实现 __iter__
和 __next__
方法。下面是一个例子:
class MyIterator:
def __iter__(self):
self.n = 1
return self
def __next__(self):
if self.n <= 10:
result = self.n
self.n += 1
return result
else:
raise StopIteration
my_iter = MyIterator()
for x in my_iter:
print(x, end=" ") # 输出:1 2 3 4 5 6 7 8 9 10
在上面的示例中,MyIterator
类实现了迭代器的两个方法。__iter__
方法返回迭代器对象自身,并初始化一个计数器 n
。__next__
方法返回计数器的值,并将计数器自增1。如果计数器超过10,则引发 StopIteration
异常来终止迭代。
创建了自定义的迭代器后,我们可以使用 for
循环来遍历它的值。
可迭代对象
在 Python 中,可迭代对象是指实现了 __iter__
方法的对象。其实,迭代器也是一种可迭代对象。与迭代器不同的是,可迭代对象可以被多次遍历,而迭代器只能遍历一次。
我们可以使用 iterable
模块中的 iter()
函数来判断一个对象是否是可迭代对象。下面是一个例子:
from collections.abc import Iterable
my_list = [1, 2, 3]
print(isinstance(my_list, Iterable)) # 输出:True
my_dict = {"name": "Alice", "age": 25}
print(isinstance(my_dict, Iterable)) # 输出:True
my_int = 123
print(isinstance(my_int, Iterable)) # 输出:False
在上面的示例中,我们使用 isinstance()
函数来判断对象是否是可迭代对象。如果是可迭代对象,则返回 True
;否则返回 False
。
可迭代对象可以通过调用 iter()
函数来返回一个迭代器对象。
使用生成器创建迭代器
在 Python 中,生成器是一种特殊的函数,可以暂停并恢复执行。生成器非常适合用来创建迭代器。我们可以使用 yield
关键字来定义生成器函数。
下面是一个使用生成器函数创建迭代器的例子:
def my_generator():
n = 1
while n <= 10:
yield n
n += 1
my_iter = my_generator()
for x in my_iter:
print(x, end=" ") # 输出:1 2 3 4 5 6 7 8 9 10
在上面的示例中,我们定义了一个生成器函数 my_generator()
。在每次调用 yield
时,生成器会返回一个值,并在下次调用时从上一次离开的地方继续执行。
创建了生成器后,我们可以像使用迭代器一样遍历它的值。
总结
迭代器是一种非常有用的工具,在处理大量数据或需要按需生成值的情况下特别有用。它们提供了一种一次处理一个值的机制,而不需要一次将所有数据加载到内存中。