我无法从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
的工作?
答案 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"
。这是None
将res = 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协同程序的一个很好的解释。太棒了。