这个Python语法是什么意思?

6 投票
2 回答
564 浏览
提问于 2025-04-16 04:07

我不是一个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 返回的是元组,这些元组被解包到 ab。所以一个元组看起来像 ('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

以这种方式使用的生成器被称为协程

撰写回答