是的,它仍然是发电机。该return
是(几乎),相当于提高StopIteration
。
PEP 255清楚地说明了这一点:
规格:返回
生成器函数还可以包含以下形式的return语句:
"return"
请注意,在生成器主体中的return语句上不允许使用expression_list(当然,它们可能会出现在嵌套在生成器中的非生成器函数的主体中)。
当遇到return语句时,控制将像在任何函数return中一样继续进行,并执行适当的finally子句(如果存在)。然后引发StopIteration异常,表示迭代器已耗尽。如果控制从生成器的末端流出而没有显式返回,则还会引发StopIteration异常。
请注意,对于生成器函数和非生成器函数,return的意思是“我完成了,没有有趣的返回值”。
请注意,return并不总是等同于提高StopIteration:不同之处在于如何处理try / except构造。例如,
>>> def f1():
... try:
... return
... except:
... yield 1
>>> print list(f1())
[]
因为像在任何函数中一样,return只是退出,但是
>>> def f2():
... try:
... raise StopIteration
... except:
... yield 42
>>> print list(f2())
[42]
因为StopIteration和任何异常一样都被一个裸露的“ except”捕获。
return
?