大锤python日记(生成器的使用)

62 阅读1分钟

一个生成器的案例:

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)的特点:只在需要时才计算结果,而不是一次性计算出所有结果。这在处理大量数据时可以提高程序的效率,并且节省内存空间。