2010-09-14 176 views
6

我不是一个蟒蛇人,我想了解一些Python代码。我想知道下面的代码的最后一行是什么?那种多个对象返回了吗?或返回3个对象的列表?这个python语法是什么意思?

req = SomeRequestBean() 
req.setXXX(xxx) 
req.YYY = int(yyy) 

device,resp,fault = yield req   #<----- What does this mean ? 

回答

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

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 

这里拉链返回元组获取解压东西线到ab。所以一个元组看起来像('a', 1),然后a == 'a'b == 1