首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当使用“产生自”表达式时,返回会做什么?

当使用“产生自”表达式时,返回会做什么?
EN

Stack Overflow用户
提问于 2015-10-09 10:26:21
回答 3查看 1.9K关注 0票数 7

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

代码语言:javascript
运行
复制
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()

它产生:

代码语言:javascript
运行
复制
» 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

但我期待着:

代码语言:javascript
运行
复制
» python test.py 
0
1
2
3
4

因为,如PEP所述:

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

显然,我不明白这个解释。“子生成器”中的returnyield from是如何工作的

EN

回答 3

Stack Overflow用户

发布于 2015-10-09 10:42:59

当发电机耗尽时,它们可以返回值:

代码语言:javascript
运行
复制
def my_gen():
    yield 0
    return "done"

g = my_gen()
next(g)
next(g) # raises StopIteration: "done"

yield from语句中的返回值将是此值。例如:

代码语言:javascript
运行
复制
def yield_from():
    res = yield from my_gen()
    assert res == "done"

默认情况下,此值为None。也就是说,res = yield from range(4)res设置为None

票数 13
EN

Stack Overflow用户

发布于 2015-10-09 10:28:52

yield from generator是缩写

代码语言:javascript
运行
复制
for i in generator:
    yield i

好吧,比这更容易沟通:https://www.python.org/dev/peps/pep-0380/#formal-semantics

如果generator = 4的话,这将不能很好地工作。(您的return4()不是生成器。这是一种功能。)

为了得到你想要的--你只需要这样做:

代码语言:javascript
运行
复制
def yield_from():
    yield from range(4)
    yield 4
票数 2
EN

Stack Overflow用户

发布于 2015-10-09 15:10:37

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

return4函数现在是一个生成器。为了实现这一点,函数中的任何地方都必须提供一个结果(Python3.5中有一个新的相关特性,但这一点现在并不重要)。

正如你已经引述的那样:

此外,当迭代器是另一个生成器时,允许子生成器使用一个值执行一个返回语句,该值将成为表达式所产生的结果的值。

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

代码语言:javascript
运行
复制
def yield_from():
    # ...
    val = yield from return4()
    print("value:", val)  # prints value: 4

但你想屈服,而不是印刷。以下是完整的代码:

代码语言:javascript
运行
复制
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是一个很好的特性。试着找到蟒蛇合作的一个很好的解释。太神奇了。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33035860

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档