生成器方法
前言
生成器方法可被用于控制生成器函数的执行,主要有以下四种方法:generator.__next__()
、generator.send(value)
、generator.throw(value)
、generator.close()
一、__next__()
方法
1. 定义
开始一个生成器函数的执行或是从上次执行 yield 表达式的位置恢复执行。 当一个生成器函数通过
__next__()
方法恢复执行时,当前的 yield 表达式总是取值为 None。 随后会继续执行到下一个 yield 表达式,这时生成器将再次挂起,而 expression_list 的值会被返回给__next__()
的调用方。 如果生成器没有产生下一个值就退出,则将引发StopIteration
异常。
2. 代码案例
def work():for i in range(3):val = yield ig = work()print(g.__next__())
print(g.__next__())
print(g.__next__())
print(g.__next__()) # 执行这里时,会引发StopIteration异常
二、send()
方法
1. 定义
恢复执行并向生成器函数“发送”一个值。 value 参数将成为当前 yield 表达式的结果。
send()
方法会返回生成器所产生的下一个值,或者如果生成器没有产生下一个值就退出则会引发 StopIteration。 当调用send()
来启动生成器时,它必须以 None 作为调用参数,因为这时没有可以接收值的 yield 表达式。
2. 使用注意点
生成器的send方法必须在使用了一次next之后才能使用,否则会报如下提示:
TypeError: can't send non-None value to a just-started generator
3. 代码案例
def work():for i in range(4):val = yield ig = work()# send方法:给生成器传递参数(与生成器内部进行数据交互)
print('next方法执行的结果:', next(g))
res = g.send('jack')
print('send方法执行的结果:', res)res = g.send('999')
print('send方法执行的结果:', res)res = g.send('python')
print('send方法执行的结果:', res)
运行结果:
next方法执行的结果: 0
send方法执行的结果: 1
send方法执行的结果: 2
send方法执行的结果: 3
三、throw()
方法
1. 定义
在生成器暂停的位置引发一个异常,并返回该生成器函数所产生的下一个值。 如果生成器没有产生下一个值就退出,则将引发 StopIteration 异常。 如果生成器函数没有捕获传入的异常,或是引发了另一个异常,则该异常会被传播给调用方。
在典型的使用场景下,其调用将附带单个异常实例,类似于使用 raise 关键字的方式。
2. 代码案例
def work():for i in range(4):val = yield ig = work()# throw方法:在生成器内部抛出指定的异常,raise ValueError
g.throw(ValueError)
四、close()
方法
1. 定义
在生成器函数暂停的位置引发
GeneratorExit
。 如果之后生成器函数正常退出、关闭或引发GeneratorExit
(由于未捕获该异常) 则关闭并返回其调用者。 如果生成器产生了一个值,关闭会引发RuntimeError
。 如果生成器引发任何其他异常,它会被传播给调用者。 如果生成器已经由于异常或正常退出则close()
不会做任何事。
2. 代码案例
def work():for i in range(4):val = yield ig = work()print(g.__next__())
print(g.__next__())# 生成器的close方法:关闭生成器
g.close()
print(g.__next__()) # 关闭生成器后,无法再使用__next__()方法