生成器对象send()和next()函数

一面问到的问题。做个记录。

send和next要结合yield一起看:https://blog.csdn.net/qq_21210467/article/details/82873870

def MyGenerator():
    value = (yield 10)
    value = (yield value)
 
 
gen = MyGenerator()
print(next(gen))
print (gen.send(2))

输出结果:

10
2

解析:

send:Resumes the generator and "sends" a value that becomes the result of the current yield-expression.
  就是说 这里yield 1整体被视为一个表达式,你send的内容会作为这个表达式的值,随便你左边用什么东西接收或者不接收,总之yield就是你send进来的那个东西。这个表达式变成你send进来后的东西后继续执行,再次遇到yield,输出yield后面跟着的表达式。这部分转自:https://blog.csdn.net/qq_38604641/article/details/71798019

python3.x里面。生成器的next调用是next(对象名)的方式,而在python2.x中是对象名.next()的方式,python2中.next()用于启动生成器。next不传入参数等价于.send(None),当有yield语句时正常运行。如上面的代码,当在调用next(gen)时next(gen)只执行到第一个yield并且只执行yield 10这一句话,直接将yield函数后面的10输出,”value=“部分用来接收下一次send进来的值。然后跳出MyGenerator(),代码执行print (gen.send(2))时候进入MyGenerator()函数将2赋值给value,相当于value=2这句话执行,接着继续执行语句value = (yield value),此时执行yield value,将value的值输出。yield value可以理解为自带输出功能。yield value不管左边有没有接收值,都是执行yield value的部分,他们是一个整体,如果不写value,不管send什么值,输出都为None。见下图:

 

同时y()函数体中运行了多少次yield那么久只能对函数体的实例对象进行几次操作,如果次数大于yield的次数就会报错。操作包括send()和next()。见下图:

当然,如果value的值在函数体中有实质的局部值,无论send()什么值,都是输出value的局部值。

扫描二维码关注公众号,回复: 3595183 查看本文章

另外,next也是可以直接输出值的,但是yield后面没有接value的时候,默认输出为None,注意是None而不是0,可以由print得到None的显示。

如果上面看完还不明白的话自己动手写点小代码就明白了,还有这里有个例子:https://blog.csdn.net/pfm685757/article/details/49924099

讲的挺好的。

猜你喜欢

转载自blog.csdn.net/qq_21210467/article/details/82890700
今日推荐