迭代器与生成器之yield关键字
迭代器和生成器是Python程序中常用的两个概念,它们都关联于迭代(iteration)的概念。迭代是指逐个访问一个序列中的元素,迭代器和生成器都可以实现这种功能。
迭代器(Iterator)是一个对象,它具有一个next()方法,用于访问序列中的下一个元素。当所有元素都被访问完后,迭代器会引发StopIteration异常。迭代器是一种惰性求值(lazy evaluation)的方式,只有当前元素被访问时才会进行计算。
Python中的迭代器是通过iter()和next()函数实现的。iter()函数接受一个集合对象作为参数,并返回一个迭代器对象。next()函数用于通过迭代器访问集合中的下一个元素。
生成器(Generator)是一种特殊的函数,它可以像迭代器一样实现惰性求值。生成器的特点是使用yield关键字来返回一个值,并在下次调用时从yield的位置继续执行。
与普通函数不同,生成器函数的执行被暂停,直到它被显式地恢复。这种恢复是通过next()函数实现的。每次调用next()函数时,生成器函数会从上次yield的位置开始执行,直到遇到下一个yield。
生成器函数可以产生一个无穷序列,因为它不需要一次性计算和存储所有的结果,而是在需要时逐个生成。这种特性使得生成器非常适合用于处理大型数据集,可以大大减少内存的使用。
下面是一个使用生成器的例子,用于生成斐波那契序列:
def fibonacci():
a, b = 0, 1
while True:
yield a
a, b = b, a + b
f = fibonacci()
print(next(f)) # 0
print(next(f)) # 1
print(next(f)) # 1
print(next(f)) # 2
print(next(f)) # 3
在这个例子中,fibonacci()是一个生成器函数,通过yield关键字返回斐波那契序列中的每个数值。通过调用next()函数,可以逐个打印出斐波那契序列的值。
通过yield关键字,生成器函数可以返回一个值,并保存当前的执行状态。下次调用时,生成器函数会从上次yield的位置开始执行,直到遇到下一个yield。这种方式使得生成器可以实现无穷序列的效果。
总的来说,迭代器和生成器都是Python中用于处理序列的强大工具。迭代器通过iter()和next()函数实现,可以逐个访问集合中的元素。生成器则是特殊的函数,使用yield关键字实现惰性求值,可以产生无穷序列。
