6

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

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 from 表达式的值。

显然,我没有得到这个解释。return“子生成器”中的 a如何与 相关yield from

4

3 回答 3

9

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

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"

默认情况下,此值为None。那res = yield from range(4)将设置resNone.

于 2015-10-09T10:42:59.443 回答
2

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
于 2015-10-09T10:28:52.413 回答
1

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

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

正如您已经引用的那样:

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

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

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 协程的一个很好的解释。太奇妙了。

于 2015-10-09T15:10:37.740 回答