我还没有从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
是如何工作的
发布于 2015-10-09 10:42:59
当发电机耗尽时,它们可以返回值:
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)
将res
设置为None
。
发布于 2015-10-09 10:28:52
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-09 15:10:37
我正在为您的测试发布一个工作示例。
return4函数现在是一个生成器。为了实现这一点,函数中的任何地方都必须提供一个结果(Python3.5中有一个新的相关特性,但这一点现在并不重要)。
正如你已经引述的那样:
此外,当迭代器是另一个生成器时,允许子生成器使用一个值执行一个返回语句,该值将成为表达式所产生的结果的值。
摘要:您将得到一个值。您可以打印它,例如:
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
是一个很好的特性。试着找到蟒蛇合作的一个很好的解释。太神奇了。
https://stackoverflow.com/questions/33035860
复制相似问题