【问题标题】:What does the expression "a = yield from f()" mean?表达式“a = yield from f()”是什么意思?
【发布时间】:2017-09-18 02:44:45
【问题描述】:

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

a = yield from f()

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

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

我理解yield x、y = yield 和y = yield x 的含义。甚至yield from f() 也或多或少可以理解。但是a = yield from f() 让我意想不到。

更新:

B. Barbieri 提供了正确的答案。我仍然需要用不同的方式来表述它。

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

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

我想现在我明白了yield from 的全部含义,希望这个解释对其他人有所帮助。

【问题讨论】:

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


    【解决方案1】:

    这是一个非常简单的例子(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()

    【讨论】:

      【解决方案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
      • 通过send 发送到g 的每个值都将转发到f

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-11-10
        • 1970-01-01
        • 2014-04-06
        • 2020-02-15
        • 1970-01-01
        • 2013-10-02
        • 2012-06-10
        • 1970-01-01
        相关资源
        最近更新 更多