1、yield的表达式形式应用的定义:
在一个生成器函数内,将yield赋值给一个变量,这就是yield的表达式形式。也叫生成器的表达式形式
2、send方法的定义:
(1)定义:
yield的表达式形式下面有一个send方法,它的作用与next方法是一样的,都是在触发函数继续往下走。除了具有next的功能外,还具有传值的效果。send传值的方式是先把要传的值交给yield,再由yield赋值给事先定义的变量名,最后才触发next效果.
def foo(): print('start') while True: x=yield print('value:',x)g=foo()#得到一个生成器next(g)#初始化生成器,实际上已经开始执行函数了,打印start,遇到yield暂停g.send(1)#send先将1传给上一次yield暂停的位置,再由yield把'1'赋值给x,最后函数再接着往下走,直到碰到yield函数才暂停 #start #value:1
(2)补充:
send(None):把None传给yield,相当于不传值,只有next效果,等同于'next(生成器变量)',一般用于生成器变量的初始化操作
3、yield表达式形式的初始化
定义:
生成器一定要走到一个暂停的位置,然后才能send传值,因为send的特性是基于一个已经暂停的yield进行传值然后再接着往下走
如果对生成器表达式形式不进行初始化操作而直接进行传值则会报以下错误:
TypeError: can't send non-None value to a just-started generator(无法将非None值发送到刚启动的生成器)
解决方法:所以必须先send一个None给生成器表达式形式或next(g)
例一:
先传一个None给生成器,否则直接报错
def foo(): print('start') while True: x = yield print('value:',x) g = foo() # 得到生成器 print(g.send(None)) # g.send(None)一般用于初始化生成器。 # 它传了一个空值给函数,相当于直接执行了next(g) # 如果不初始化则会报以下错误: # TypeError: can't send non-None value to a just-started generator print('---------------------------')print(g.send(1)) # 先将数字1传给yield,,再执行next(g),所以打印函数返回值的结果还是None。print('---------------------------')print(g.send(2)) # 先将数字2传给yield,,再执行next(g),所以打印函数返回值的结果还是None。print('---------------------------')print(next(g))
输出结果:
startNone---------------------------value: 1None---------------------------value: 2None---------------------------value: NoneNone