【发布时间】:2017-09-16 03:50:44
【问题描述】:
很长一段时间我都不知道您不能将return 放在yield 语句前面。但实际上你可以:
def gen():
return (yield 42)
类似于
def gen():
yield 42
return
我能想到的唯一用法是将发送的值附加到StopIteration:pep-0380
在生成器中返回 expr 会引发 StopIteration(expr) 从生成器退出时。
def gen():
return (yield 42)
g = gen()
print(next(g)) # 42
try:
g.send('AAAA')
except StopIteration as e:
print(e.value) # 'AAAA'
但这也可以使用额外的变量来完成,这更明确:
def gen():
a = yield 42
return a
g = gen()
print(next(g))
try:
g.send('AAAA')
except StopIteration as e:
print(e.value) # 'AAAA'
所以看起来return (yield xxx) 只是一个语法糖。我错过了什么吗?
【问题讨论】:
-
“但这也可以使用一个额外的变量来完成,这更明确” - 你可以这样说任何
return语句。return x + y变为z = x + y; return z。return foo()变为x = foo(); return x。return (yield whatever)这里没有任何特定的内容。 -
至于
StopIteration参数,您不需要显式访问这些参数;这就是yield from表达式值的实现方式。它是 API 的已发布部分,但通常不是有趣的部分。