大锤python日记(生成器的两种启动方式)

51 阅读2分钟

使用两种不同的方式启动生成器和注意事项:

# 定义一个生成器函数
def fibonacci():
    a, b = 0, 1
    while True:
        yield a
        a, b = b, a + b

# 使用 next() 函数启动生成器
fib = fibonacci()
print(next(fib))  # 输出:0
print(next(fib))  # 输出:1
print(next(fib))  # 输出:1
print(next(fib))  # 输出:2

# 使用 send() 函数启动生成器并发送值
fib = fibonacci()

# fib.send(None) 第一次使用send启动生成器的话,需要传递None
next(fib)            # 输出:0
print(fib.send(10))  # 输出:1,10 并没有被使用
print(fib.send(20))  # 输出:1,20 并没有被使用
print(fib.send(30))  # 输出:2,30 并没有被使用
print(fib.send(40))  # 输出:3,40 并没有被使用

# 再次调用 send() 函数会出现 StopIteration 异常
try:
    fib.send(50)
except StopIteration:
    print('StopIteration occurred')

在这个例子中,我们定义了一个生成器函数 fibonacci(),它可以返回斐波那契数列的序列。我们使用 yield 语句逐个生成序列中的值。

接着,我们使用 next() 函数来启动生成器并获取下一个值。再次调用 next() 函数时,生成器会从上一次暂停的位置继续执行,直到遇到下一个 yield 语句。

然后,我们使用 send() 函数启动生成器并向其发送数字值。注意,在第一次调用 send() 函数之前必须先调用一次 next() 函数。

最后,我们尝试再次调用 send() 函数,但是这时候生成器已经执行完毕并抛出了 StopIteration 异常。

在使用生成器时,需要注意的事项

  1. 在初次启动生成器时,不应该传递任何参数;
  2. 在使用 yield 语句发送值之前,生成器函数会暂停并等待下一次的激活;
  3. 当生成器函数已经执行结束时,再次调用 send() 函数会导致 StopIteration 异常的抛出。