这个Python语法是什么意思?
我不是一个Python高手,现在在尝试理解一些Python代码。我想知道下面代码的最后一行是干什么的?是返回多个对象吗?还是返回一个包含三个对象的列表呢?
req = SomeRequestBean()
req.setXXX(xxx)
req.YYY = int(yyy)
device,resp,fault = yield req #<----- What does this mean ?
2 个回答
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
。
9
这一行代码里有两个事情。首先,比较容易理解的是,yield
这个语句是在返回一个值,这个值是一个序列。所以,逗号会把序列中的值取出来,放到变量里,就像这样:
>>> def func():
... return (1,2,3)
...
>>> a,b,c = func()
>>> a
1
>>> b
2
>>> c
3
接下来,yield
语句是用来创建一个生成器的,生成器可以返回多个值,而不是仅仅一个。每次使用 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
以这种方式使用的生成器被称为协程。