> 文章列表 > 生成器方法

生成器方法

生成器方法

前言

生成器方法可被用于控制生成器函数的执行,主要有以下四种方法: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__()方法