- 当处理大型数据集时,或者当想要创建一个可迭代对象而不将整个序列或序列存储在内存中时,它们特别有用。
迭代器:
迭代器是一个对象,它使我们能够一次遍历或迭代一个序列或一系列数据。它遵循迭代器约定,并涉及通过使用
i. __iter__() 和ii. __next__() 方法。
迭代器约定:
__iter__():此方法返回迭代器对象本身。它负责初始化或重建迭代器。
__next__():此方法返回序列或序列中的下一个元素。如果没有更多元素,则会引发 StopIteration 异常。
Class Iter():
def __init__(self, start, end):
self.cur = start
self.end = end
def __iter__(self):
return self
def __next__(self):
if self.cur >= self.end:
raise StopIteration
else:
self. cur += 1
return self.cur - 1
my_iter = iterator(1, 5)
for i in my_iter:
print(i)
优势:
高效的内存使用:非常适合处理大型数据集,因为它无需检查或动态生成值。
支持延迟评估:仅在需要时生成值。它可以在不必要的操作上节省更多时间。
应用:
- 逐行读取大文件。
- 数据库查询结果。
- 动态生成序列。
生成器:
- 生成器提供了一种简洁有效的迭代器创建方式。
- 它们使用一种特殊类型的函数,其中包含 yield 语句。
每当调用生成器函数时,它都会返回一个生成器迭代器,并允许它循环访问 yield 语句生成的值。
生成器的功能:
使用 yield 生成值,并暂时暂停其状态,直到下一次迭代。
自动管理本地状态,使其更易于编写和理解。
def my_gen(start, end):
cur= start
while cur < end:
yield current
cur += 1
gen = my_gen(1, 5)
for num in gen:
print(num)
def my_gen(start, end):
current = start
while current < end:
yield current
current += 1
print("Generator finished")
gen = my_gen(1, 5)
for num in gen:
print(num)
优势:
- 清晰的语法:与手动迭代器实现相比,提供更易读和更紧凑的语法。
- 自动状态管理:简化局部变量和状态的处理。
应用:
- 高效处理大型数据集,而无需将其完全加载到内存中。
- 实现惰性评估。
- 创建无限的值序列。