参考:https://blog.csdn.net/weixin_40247263/article/details/82724878
本文讲解Python生成器的send,close函数与yield关键字协作
generator的seng()函数和yield关键字
以之前对yield关键字的了解,无非就是yield关键字可以给调用者返回消息,同时当函数通过yield关键字返回消息以后函数会暂停在当前位置。
首先复习一下生成器yield关键字的使用
test.py
# 定义一个生成器生成从2开始无限翻倍的数字序列 # 2 4 8 16 32 def test(): number = 1 while True: number = number * 2 yield number print('我是yield关键字下面一行代码') t = test() print(next(t)) # 2 print(next(t)) # 我是yield关键字下面一行代码 # 4 print(next(t)) # 我是yield关键字下面一行代码 # 8
解析输出过程
以此类推,这个生成器是无限的,如果使用for循环进行迭代则需要设置退出条件
但其实yield关键字的作用是函数与调用者的通信,它不光能够将值返回给调用者,它还可以接收调用者传过来的值,那么怎么实现呢?调用者通过send()函数将值传递给generator,generator通过yield前面的变量来接收,示例如下:
def test(): number = 0 while True: n = yield number print('我是yield关键字下面一行代码') print('通过send函数传递的值是:',n) t = test() print(t.send(None)) # 0 print(t.send(1)) # 我是yield关键字下面一行代码 # 通过send函数传递的值是: 1 # 0
输出结果分析
即执行send相当于执行了next不一样的是send可以传递参数给生成器,如果传递的参数为None则send方法等价于next方法。
generator的close函数
由于下面还涉及到一个 close函数,这里也演示一下,方便下面理解
t.close() print(next(t))
关闭generator后再调用,会出现StopIteration异常,即后面没值了。