一个生成器的案例:
def countdown(n):
while n > 0:
yield n
n -= 1
这段代码定义了一个名为countdown
的生成器函数。当调用该函数时,它会返回一个生成器对象,而不是立即执行函数内的代码。每次调用生成器对象的__next__()
方法时,它会从上一次停下的位置继续执行,直到遇到yield
关键字,然后将yield
后面的值作为生成器的输出,并且暂停函数的执行。
在这个案例中,countdown
函数使用一个while循环实现了一个倒计时的功能,从传入的参数n
开始,依次输出n-1,n-2,...,3,2,1。由于使用了yield
关键字,这个函数被转换为一个生成器,每次调用生成器对象时,都会输出一个新的倒计时数字。
下面是一些示例代码,演示了如何使用countdown
函数进行倒计时:
# 创建一个生成器对象
counter = countdown(5)
# 调用生成器对象输出倒计时数字
print(next(counter)) # 输出 5
print(next(counter)) # 输出 4
print(next(counter)) # 输出 3
print(next(counter)) # 输出 2
print(next(counter)) # 输出 1
当生成器对象输出完所有数字后,再次调用next()
方法会抛出StopIteration
异常,表示生成器已经完成了它的任务。
这种基于迭代器协议实现的生成器,具有惰性求值(lazy evaluation)的特点:只在需要时才计算结果,而不是一次性计算出所有结果。这在处理大量数据时可以提高程序的效率,并且节省内存空间。