我不是一个python的人,我想了解一些python代码。我想知道下面代码的最后一行是做什么的?这种多个对象是否被返回?还是返回了3个对象的列表?
req = SomeRequestBean()
req.setXXX(xxx)
req.YYY = int(yyy)
device,resp,fault = yield req #<----- What does this mean ?
答案 0 :(得分:9)
该行正在进行两项工作。更容易解释的是yield
语句返回的值是一个序列,因此逗号获取序列的值并将它们放入变量中,如下所示:
>>> def func():
... return (1,2,3)
...
>>> a,b,c = func()
>>> a
1
>>> b
2
>>> c
3
现在,yield
语句用于create a generator,它可以返回多个值而不是一个,每次使用yield
时返回一个值。例如:
>>> def func():
... for a in ['one','two','three']:
... yield a
...
>>> g = func()
>>> g.next()
'one'
>>> g.next()
'two'
>>> g.next()
'three'
实际上,该函数在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
把这一切放在一起我们得到:
>>> def func():
... total = 0
... while True:
... x,y = yield total
... total = total + (x * y)
...
>>> g = func()
>>> g.next()
0
>>> g.send([6,7])
42
以这种方式使用的生成器是called a coroutine。
答案 1 :(得分:4)
最后一行是从显示代码所在的协同程序的send
方法解压缩元组。
也就是说它出现在一个函数中:
def coroutine(*args):
yield None
req = SomeRequestBean()
req.setXXX(xxx)
req.YYY = int(yyy)
device,resp,fault = yield req
然后有一个类似于此的客户端代码。
co = coroutine(*args)
next(co) # consume the first value so we can start sending.
co.send((device, resp, fault))
这个不涉及协同程序的更简单的例子就是
a, b, c = (1, 2, 3)
或(略微发烧)
for a, b in zip(['a', 'b'], [1, 2]):
print a, b
此处zip会返回解压缩到a
和b
的元组。所以一个元组看起来像('a', 1)
然后a == 'a'
和b == 1
。