1. 迭代器 (Iterator)
迭代器 是一种对象,它实现了 __iter__()
和 __next__()
方法,使得它可以在一个迭代过程中逐个返回元素。
实现迭代器
你可以通过创建一个类并实现 __iter__()
和 __next__()
方法来定义一个自定义迭代器。
class MyIterator:
def __init__(self, start, end):
self.current = start
self.end = end
def __iter__(self):
return self # 迭代器的 __iter__ 方法返回迭代器本身
def __next__(self):
if self.current < self.end:
self.current += 1
return self.current - 1
else:
raise StopIteration # 当迭代结束时抛出 StopIteration
# 使用迭代器
my_iter = MyIterator(1, 5)
for num in my_iter:
print(num) # 输出: 1, 2, 3, 4
2. 生成器 (Generator)
生成器 是一种特殊类型的迭代器,它使用 yield
关键字来生成值。生成器函数在执行时会暂停,并在下次调用时继续执行,直到代码执行完毕或遇到 return
语句。
实现生成器
生成器是通过定义一个使用 yield
关键字的函数来创建的。
def my_generator(start, end):
current = start
while current < end:
yield current
current += 1
# 使用生成器
for num in my_generator(1, 5):
print(num) # 输出: 1, 2, 3, 4
3. 迭代器与生成器的区别
-
实现方式:
- 迭代器:需要实现
__iter__()
和__next__()
方法,通常通过定义类来实现。 - 生成器:通过定义一个包含
yield
语句的函数来实现。
- 迭代器:需要实现
-
内存使用:
- 迭代器:需要在内存中保持状态(如当前元素索引),可能需要存储整个数据集。
- 生成器:在需要时生成数据,不需要在内存中存储整个数据集,更加节省内存。
-
代码简洁性:
- 迭代器:需要显式地管理状态和停止条件,代码较复杂。
- 生成器:代码更简洁,
yield
自动处理状态和停止条件。
-
可复用性:
- 迭代器:可以通过多次调用
__iter__()
方法来重新开始迭代。 - 生成器:一次性使用,除非重新调用生成器函数。
- 迭代器:可以通过多次调用
-
性能:
- 迭代器:在需要频繁操作和管理状态时可能更灵活。
- 生成器:通常更高效,特别是在处理大型数据集时,因为它们在需要时才生成数据。
4. 使用场景
- 迭代器:适用于需要复杂状态管理、可能涉及多种迭代逻辑的场景。例如,自定义数据结构的遍历。
- 生成器:适用于处理大量数据或流式数据的场景,特别是需要逐步处理数据而不是一次性加载整个数据集时。例如,处理大文件或无限序列。