表达式" a =从f()"得到什么?意思?

时间:2017-04-21 07:49:39

标签: python-3.x yield yield-from

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

a = yield from f()

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

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

我理解yield xy = yieldy = yield x的含义。甚至yield from f()或多或少都是可以理解的。但a = yield from f()对我来说意外。

更新

B中。芭比里提供了正确的答案。我仍然需要以不同的方式制定它。

表达式a = yield from f()的语义与函数调用非常相似:a的值将是f()返回的值。但是如果f()产生任何结果,则产生的值将被转发到"更高级别" (你只能在函数内写a = yield from f(),这将使你成为一个生成器。如果在那之后"上层"将值发回给您的生成器,该值将转发到f()f()将继续。

yield from允许f()和"更高级别"在功能运行时进行通信。

我想我现在明白这个yield from到底是什么,希望这个解释对其他人有所帮助。

2 个答案:

答案 0 :(得分:2)

根据the documentation

  • 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发送给send的每个值都会转发到f

注意:您需要先启动您的生成器才能send

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

我已经测试了所有内容,如果有任何不清楚的地方,请不要犹豫。

答案 1 :(得分:2)

这是一个非常简单的例子(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必须是生成器(yield s)。
  • a只会被赋予f()
  • 的返回值