当使用"来自"的收益时,回报会做什么?表达?

时间:2015-10-09 10:26:21

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

我无法从yield from expression找到任何返回值的示例。我尝试过这个简单的代码,但没有成功:

def return4():
    return 4


def yield_from():
    res = yield from range(4)
    res = yield from return4()


def test_yield_from():
    for x in yield_from():
        print(x)


test_yield_from()

产生:

» python test.py 
0
1
2
3
Traceback (most recent call last):
  File "test.py", line 52, in <module>
    test_yield_from()
  File "test.py", line 48, in test_yield_from
    for x in yield_from():
  File "test.py", line 44, in yield_from
    res = yield from return4()
TypeError: 'int' object is not iterable

但我在期待:

» python test.py 
0
1
2
3
4

因为,如PEP中所述:

  

此外,当迭代器是另一个生成器时,允许子生成器执行带有值的return语句,该值将成为表达式中yield的值。

显然,我没有得到这个解释。一个&#34;子生成器中的return如何&#34;关于yield from的工作?

3 个答案:

答案 0 :(得分:6)

生成器在耗尽时可以返回值:

module MyMethodProvider
  def my_method
    puts self.class.name
  end
end

class Foo
  include MyMethodProvider
end

class Bar; end

bar = Bar.new

bar.singleton_class.include(MyMethodProvider)

bar.my_method
#=> Bar

def my_gen(): yield 0 return "done" g = my_gen() next(g) next(g) # raises StopIteration: "done" 语句中返回的值将是此值。例如

yield from

默认情况下,此值为def yield_from(): res = yield from my_gen() assert res == "done" 。这是Noneres = yield from range(4)设为res

答案 1 :(得分:0)

yield from generator

的缩写
for i in generator:
    yield i
好吧,它比这更复杂:https://www.python.org/dev/peps/pep-0380/#formal-semantics

如果generator = 4,这将无效。 (您的return4()不是生成器。它是函数。)

为了得到你的魔杖你会这样做:

def yield_from():
    yield from range(4)
    yield 4

答案 2 :(得分:0)

我正在为您的测试发布一个工作示例。

return4函数现在是一个生成器。要实现这一点,函数必须存在于函数中的任何位置(Python 3.5中有一个新的相关特性,但现在这并不重要。)

正如你所说:

  

此外,当迭代器是另一个生成器时,子生成器   允许执行带有值和该值的return语句   从表达式

变成收益的价值

摘要:您将获得一个值。你可以打印它,例如:

def yield_from():
    # ...
    val = yield from return4()
    print("value:", val)  # prints value: 4

但是你想要它,而不是打印。这是完整的代码:

def return4():
    if False:
        yield None
    return 4

def yield_from():
    yield from range(4)
    yield (yield from return4())

def test_yield_from():
    for x in yield_from():
        print(x)

test_yield_from()
# prints numbers 0 to 4

你可能会问自己,它有什么好处。当您仅从发电机接收值时几乎没有优势。但是,当您向生成器发送值时,yield from是一个很棒的功能。试着找到python协同程序的一个很好的解释。太棒了。