本文讲解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


  解析输出过程

Python生成器: send函数、close函数与yield关键字协作_for循环

 

 Python生成器: send函数、close函数与yield关键字协作_javascript_02

 

 Python生成器: send函数、close函数与yield关键字协作_for循环_03

 

 Python生成器: send函数、close函数与yield关键字协作_值传递_04

 

 Python生成器: send函数、close函数与yield关键字协作_生成器_05

 

 Python生成器: send函数、close函数与yield关键字协作_值传递_06

 

 Python生成器: send函数、close函数与yield关键字协作_for循环_07

 

 Python生成器: send函数、close函数与yield关键字协作_传递参数_08

 

 Python生成器: send函数、close函数与yield关键字协作_值传递_09

 

 Python生成器: send函数、close函数与yield关键字协作_值传递_10

 

 Python生成器: send函数、close函数与yield关键字协作_for循环_11

 

 Python生成器: send函数、close函数与yield关键字协作_for循环_12

 

   以此类推,这个生成器是无限的,如果使用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


  输出结果分析

Python生成器: send函数、close函数与yield关键字协作_javascript_13

 

 Python生成器: send函数、close函数与yield关键字协作_传递参数_14

 

 Python生成器: send函数、close函数与yield关键字协作_for循环_15

 

 Python生成器: send函数、close函数与yield关键字协作_传递参数_16

 

 Python生成器: send函数、close函数与yield关键字协作_for循环_17

 

 Python生成器: send函数、close函数与yield关键字协作_for循环_18

 

 Python生成器: send函数、close函数与yield关键字协作_javascript_19

 

 Python生成器: send函数、close函数与yield关键字协作_值传递_20

 

 Python生成器: send函数、close函数与yield关键字协作_javascript_21

 

 Python生成器: send函数、close函数与yield关键字协作_生成器_22

 

   即执行send相当于执行了next不一样的是send可以传递参数给生成器,如果传递的参数为None则send方法等价于next方法。

  generator的close函数

  由于下面还涉及到一个 close函数,这里也演示一下,方便下面理解



t.close()
print(next(t))


  关闭generator后再调用,会出现StopIteration异常,即后面没值了。