一、什么是迭代器
迭代器是可以被用来逐一遍历集合中的元素的对象。简而言之,迭代器允许我们一项一项地访问数据,而无需了解数据结构的底层实现。
在Python中,任何实现了__iter__()和__next__()方法的对象都可以成为迭代器。
__iter__()方法返回迭代器对象本身。__next__()方法返回容器中的下一个元素,- 重复步骤2,直到抛出
StopIteration异常,表示遍历结束。
举个例子,我们可以自己实现一个简单的迭代器:
class MyIterator:
def __init__(self, start, end):
self.current = start
self.end = end
def __iter__(self):
return self # 返回迭代器对象本身
def __next__(self):
if self.current >= self.end:
raise StopIteration # 如果没有更多元素,抛出异常
self.current += 1
return self.current - 1 # 返回当前元素
my_iter = MyIterator(1, 5)
for num in my_iter:
print(num)
输出:
1
2
3
4
可以看到,for循环背后其实是通过不断调用迭代器的__next__()方法来遍历元素,直到抛出StopIteration为止。
二、什么是生成器
生成器是Python中一种更简洁、更高效的迭代器实现方式。与传统迭代器相比,生成器不需要显式定义类或__iter__()和__next__()方法。它是通过yield关键字定义的一个函数。
yield语句用于生成一个值,并暂停函数的执行。下一次调用时,从暂停的地方继续执行,直到遇到下一个yield或者结束。
一个典型的生成器示例:
def my_generator(start, end):
current = start
while current < end:
yield current # 每次返回一个值并暂停
current += 1
gen = my_generator(1, 5)
for num in gen:
print(num)
输出:
1
2
3
4
你可以看到,生成器和迭代器的行为类似,唯一的不同是生成器通过yield来生成数据,而不是通过__next__()方法逐个返回。