2

所以,这是一个python表达式:

a = yield from f()

这是什么意思?它可以在哪里使用?应该是什么样的对象f?计算表达式后的值a是多少?

stackoverflow上有几个关于python的问题yieldyield from但我没有找到答案。

我理解 和的yield x含义。Even或多或少可以理解。但对我来说是意外的事情。y = yieldy = yield xyield from f()a = yield from f()

更新:

B. Barbieri 提供了正确答案。我仍然需要稍微不同地制定它。

表达式的语义与a = yield from f()函数调用非常相似:返回af()。但是如果f()产生任何东西,产生的值将被转发到“上层”(你只能a = yield from f()在函数内部编写,这将使你成为一个生成器)。如果在那之后“上层”将一个值发送回您的生成器,该值将被转发到f()并且f()将继续。

yield from允许和“f()上层”在您的函数运行时进行通信。

我想现在我确实明白这一切yield from是怎么回事,并希望这种解释对其他人有所帮助。

4

2 回答 2

4

这是一个非常简单的例子(yield from只能在函数内部使用)

def f():
    for i in range(2):
        yield i
    return 3

def g():
    a = yield from f()
    print('a = {}'.format(a))

for item in g():
    print(item)

# output:
# 0
# 1
# a = 3

a被赋予函数f()返回的值。生成器g产生所有中间结果。

  • f必须是生成器(yields)。
  • a将简单地分配返回值f()
于 2017-05-02T08:34:20.957 回答
2

根据文档

  • f应该是一个生成器(这并不奇怪)
  • f应该返回(而不仅仅是产量)
  • f应该接受send使用的价值some_var = yield
  • a将收到返回的值f

这是一个f例子:

def f():
    while 1:
        x = yield
        if next is None:
            return "something"
        do_something_with_recieved_value(x)

考虑生成器g

l = []
def g():
    while True:
        a = yield from f()
        l.append(a)
  • 每当f返回时,将返回的值放入l
  • g发送到via的每个值send都将转发到f

注意:您需要先启动生成器,然后才能使用send它。

o = g()
next(o)  # Ensure the accumulator is ready to accept values

我还没有测试所有内容,如果有任何不清楚的地方,请随时发表评论。

于 2017-04-24T14:19:35.007 回答