使用两种不同的方式启动生成器和注意事项:
# 定义一个生成器函数
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
异常。
在使用生成器时,需要注意的事项
- 在初次启动生成器时,不应该传递任何参数;
- 在使用
yield
语句发送值之前,生成器函数会暂停并等待下一次的激活; - 当生成器函数已经执行结束时,再次调用
send()
函数会导致StopIteration
异常的抛出。