了解 Python 迭代器与生成器的核心概念
在 Python 中,迭代器和生成器是用于迭代数据结构的两个重要概念。它们提供了一种简洁高效的方式来处理数据流。
迭代器
迭代器是一个对象,它实现了两个基本方法:__iter__()
和 __next__()
。迭代器是一个遵循迭代器协议的对象,可以在集合上进行迭代。以下是关于迭代器的核心概念:
__iter__()
方法:返回迭代器对象本身。它使对象可迭代,并在使用iter()
函数时被调用。__next__()
方法:返回容器的下一个元素。如果没有元素可返回,它应该引发StopIteration
异常来结束迭代。创建迭代器:通过实现上述两个方法,可以将任何常规对象转化为迭代器。
使用迭代器:迭代器使用
next()
函数来获取元素。例如:my_list = [1, 2, 3]
my_iter = iter(my_list)
print(next(my_iter)) # 输出: 1
print(next(my_iter)) # 输出: 2
print(next(my_iter)) # 输出: 3
# print(next(my_iter)) # 引发 StopIteration 异常
生成器
生成器是使用函数语法编写的迭代器,常用来生成迭代器。生成器以 yield
语句产生一个值挂起其状态,并在下一次恢复。生成器更为简洁,并自动支持迭代器协议。核心概念包括:
yield
关键字:yield
类似于函数的返回值,但它不会终止生成器,允许函数生成一个序列的值。生成器函数:使用
yield
的函数即为生成器函数,调用时返回一个生成器对象。状态挂起:生成器函数的状态在函数调用间保留。多次调用可以有状态继续上次的执行。
无须手动实现迭代器协议:由
yield
自动完成。示例:
def my_generator():
yield 1
yield 2
yield 3
gen = my_generator()
print(next(gen)) # 输出: 1
print(next(gen)) # 输出: 2
print(next(gen)) # 输出: 3
# print(next(gen)) # 引发 StopIteration 异常
区别与优势
内存效率:生成器在内存上更为高效,因为它们一次只生成一个值,而不是将所有值存储在内存中。
可读性和易用性:生成器因其使用
yield
的语法可读性和简洁性高,避免了手动管理迭代器方法。偏好场景:当需要处理大量数据且不希望一次全部加载时使用生成器,也适合需要惰性生成序列的场合。
通过理解迭代器和生成器,Python 开发者能够编写更高效和更 Pythonic 的代码,以便在处理流数据时提升程序性能。