当在Python中的同一函数中使用yield和return时,究竟会发生什么?
def find_all(a_str, sub):
start = 0
while True:
start = a_str.find(sub, start)
if start == -1: return
yield start
start += len(sub) # use start += 1 to find overlapping matches
Run Code Online (Sandbox Code Playgroud)
它还是发电机吗?
NPE*_*NPE 62
是的,它仍然是一个发电机.的return
(几乎),相当于提高StopIteration
.
PEP 255说出来:
规格:退货
生成器函数还可以包含以下形式的return语句:
Run Code Online (Sandbox Code Playgroud)"return"
请注意,生成器主体中的return语句不允许使用expression_list(当然,它们可能出现在嵌套在生成器中的非生成器函数的主体中).
遇到return语句时,控制继续执行任何函数返回,执行适当的finally子句(如果存在).然后引发StopIteration异常,表示迭代器已耗尽.如果控制流出生成器的末尾而没有显式返回,也会引发StopIteration异常.
请注意,对于生成器函数和非生成器函数,返回表示"我已完成,并且没有任何有趣的返回".
请注意,返回并不总是等同于提高StopIteration:区别在于如何处理封闭的try/except结构.例如,
Run Code Online (Sandbox Code Playgroud)>>> def f1(): ... try: ... return ... except: ... yield 1 >>> print list(f1()) []
因为,就像在任何函数中一样,返回只是退出,但是
Run Code Online (Sandbox Code Playgroud)>>> def f2(): ... try: ... raise StopIteration ... except: ... yield 42 >>> print list(f2()) [42]
因为StopIteration是由一个简单的"除外"捕获的,就像任何异常一样.
Ash*_*ary 25
是的,它仍然是一个发电机.空return
或return None
可用于结束生成器功能.这相当于提高了StopIteration
(详见@ NPE的答案).
请注意,带有非None参数的返回是SyntaxError
3.3之前的Python版本.
正如@BrenBarn在从Python 3.3开始的评论中指出的那样,返回值现在传递给了 StopIteration.
从PEP 380:
在发电机中,声明
Run Code Online (Sandbox Code Playgroud)return value
在语义上等同于
Run Code Online (Sandbox Code Playgroud)raise StopIteration(value)
Wil*_*ack 10
有一种方法可以在函数中实现yield和return方法,该函数允许您返回值或生成器.
它可能不像你想要的那么干净,但它确实做你期望的.
这是一个例子:
def six(how_many=None):
if how_many is None or how_many < 1:
return None # returns value
if how_many == 1:
return 6 # returns value
def iter_func():
for count in range(how_many):
yield 6
return iter_func() # returns generator
Run Code Online (Sandbox Code Playgroud)