Gop*_*opi 6 python yield generator
我不是一个python的家伙,我想了解一些python代码.我想知道下面代码的最后几行是做什么的?这种多个对象是否被返回?还是返回了3个对象的列表?
req = SomeRequestBean()
req.setXXX(xxx)
req.YYY = int(yyy)
device,resp,fault = yield req #<----- What does this mean ?
Run Code Online (Sandbox Code Playgroud)
这一行有两件事情.更容易解释的是yield语句返回的值是一个序列,因此逗号获取序列的值并将它们放入变量中,如下所示:
>>> def func():
... return (1,2,3)
...
>>> a,b,c = func()
>>> a
1
>>> b
2
>>> c
3
Run Code Online (Sandbox Code Playgroud)
现在,该yield语句用于创建一个生成器,它可以返回多个值而不是一个,每次使用时返回一个值yield.例如:
>>> def func():
... for a in ['one','two','three']:
... yield a
...
>>> g = func()
>>> g.next()
'one'
>>> g.next()
'two'
>>> g.next()
'three'
Run Code Online (Sandbox Code Playgroud)
实际上,该函数在yield语句处停止,等待在继续之前被要求输入下一个值.
在上面的示例中,next()从生成器获取下一个值.但是,如果我们使用,send()我们可以将值发送回生成器,由yield语句返回到函数中:
>>> def func():
... total = 0
... while True:
... add = yield total
... total = total + add
...
>>> g = func()
>>> g.next()
0
>>> g.send(10)
10
>>> g.send(15)
25
Run Code Online (Sandbox Code Playgroud)
把这一切放在一起我们得到:
>>> def func():
... total = 0
... while True:
... x,y = yield total
... total = total + (x * y)
...
>>> g = func()
>>> g.next()
0
>>> g.send([6,7])
42
Run Code Online (Sandbox Code Playgroud)
以这种方式使用的发电机称为协程.