Yield 用法浅析

next()send(msg)的区别和联系

在Python3中next()变成__next__()

  • next()无法传入值,其等价于send(None)
  • send(msg)可以向生成器中传入参数
  • 使用yield的函数,若用send来控制,就算是coroutine(协程)了,若用for循环来控制,就算generator或者iterator
  • nextsend的返回值都是yield右边的表达式的值
  • 无论是send还是next,都会从上次执行的yield的下一行开始i执行,并且执行到下一个yield,这个下一个yield这行是要执行的,但是执行完就停住。先返回yield右边的表达式(体现迭代器的功能,利用for循环取得就是其返回的值。)然后暂停执行。如果再次执行next指令,则首先将yield右边的变量赋值为None(如果是执行send(msg)则将右边的变量赋值为msg

yield 表达式

yield表达式, 四种形式:

a. 不接受输入值或者输入值是None

yield 1

b. 接受输入值

s = yield 1

c. 接受输入,但不返回数据,这样默认返回None

s = yield

d.既不接受输入,也不返回值,默认返回None

yield

第一种:当函数调用到yield时,返回yield的右边经过计算的值 ,这里说计算的意思是,yield后面可以写成函数,表达式等,

第二种:当函数调用到yield时,必须传入一个值,该值存入s中,然后返回yield后面的表达式的值并保存当前状态

第三种:只是将数据接受进来,然后执行yield后的语句,再次执行到yield时,保存当前状态并返回,这样的用例一般是

只打印一些处理消息,而不需要结果的方式。

第四种:这样的只能遍历generator内部的数据了。

http://blog.csdn.net/xiaobing_blog/article/details/44536323

例如

1
2
3
4
5
6
7
8
9
10
11
def test():
s = 0
for x in range(10):
s = yield x * s #1
print('s:',s)
print('x',x)

f = test()
f.__next__() # 等同于f.send(None)
f.send(10)
f.send(20)

当执行f.__next__()时,程序执行到 #1处,s==0,x==0
当执行f.send(10)时,s 被赋值为10,输出s==10,x==0,程序再次执行到 #1处停止
当执行f.send(20)时,s 被赋值为20,输出s==20,x==1,程序再次执行到 #1处停止

f.__next__()启动generator对象,运行到yield表达式为止,并将yield右边的值返回,并保存当前状态
f.send(10),读取之前保存的状态,并将10赋值给s,再次运行到yield表达式为止,并返回yield右边表达式的值。

本文标题:Yield 用法浅析

文章作者:定。

发布时间:2017年3月15日 - 19时03分

本文字数:1,087字

原始链接:http://cocofe.cn/2017/03/15/yield用法浅析/

许可协议: Attribution-NonCommercial 4.0

转载请保留以上信息。