python 中的生成器和迭代器
迭代器
定义
迭代器是实现了__iter__()
和__next__()
方法的对象。它允许用户逐个访问集合中的元素,而不需要知道集合的底层结构。
工作原理
__iter__()
:返回迭代器对象自身。__next__()
:返回集合中的下一个元素。如果没有更多元素可供返回,则抛出StopIteration
异常。
示例
1class MyIterator:
2 def __init__(self, data):
3 self.data = data
4 self.index = 0
5
6 def __iter__(self):
7 return self
8
9 def __next__(self):
10 if self.index < len(self.data):
11 result = self.data[self.index]
12 self.index += 1
13 return result
14 else:
15 raise StopIteration
16
17# 使用迭代器
18my_iter = MyIterator([1, 2, 3])
19for item in my_iter:
20 print(item) # 输出: 1 2 3
生成器
定义
生成器是使用yield
关键字定义的特殊类型的迭代器。与普通函数不同,生成器函数在执行时会暂停,并在下一次调用时继续执行。
工作原理
- 当调用生成器函数时,它返回一个生成器对象,而不是立即执行函数体。
- 每次调用
next()
时,生成器函数会从上次暂停的地方继续执行,直到遇到下一个yield
语句。 yield
语句会返回一个值并暂停函数的执行状态。
示例
1def my_generator():
2 yield 1
3 yield 2
4 yield 3
5
6# 使用生成器
7gen = my_generator()
8for item in gen:
9 print(item) # 输出: 1 2 3
生成器表达式
生成器表达式是一种更简洁的生成器创建方式,类似于列表推导式,但使用圆括号:
迭代器与生成器的比较
- 内存使用:生成器在需要时逐个生成值,因而更节省内存;而迭代器通常需要在内存中存储整个数据集。
- 性能:生成器可以按需计算,避免一次性计算所有元素,从而提高性能,特别是在处理大型数据集时。
- 语法:生成器使用
yield
关键字,语法更简洁,且可以轻松实现复杂的迭代逻辑。