这个python语法是什么意思?

时间:2010-09-14 08:57:53

标签: python generator yield

我不是一个python的人,我想了解一些python代码。我想知道下面代码的最后一行是做什么的?这种多个对象是否被返回?还是返回了3个对象的列表?

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

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

2 个答案:

答案 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会返回解压缩到ab的元组。所以一个元组看起来像('a', 1)然后a == 'a'b == 1