Python 同一函数中的收益率和收益率
在Python中,当yield和return在同一个函数中使用时,会发生什么情况Python 同一函数中的收益率和收益率,python,yield,Python,Yield,在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
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
它还是发电机吗?是的,它还是发电机。
返回
几乎等同于提升StopIteration
详细说明:
规格:退货
生成器函数还可以包含以下形式的返回语句:
"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”捕获的,就像任何
例外
是的,它还是一台发电机。
返回
几乎等同于提升StopIteration
详细说明:
规格:退货
生成器函数还可以包含以下形式的返回语句:
"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”捕获的,就像任何
例外
是的,它仍然是一台发电机。空的
返回值
或无返回值
可用于结束发电机功能。这相当于引发一个StopIteration
(有关详细信息,请参阅)
请注意,在3.3之前的Python版本中,带有非None参数的返回是一个SyntaxError
正如@BrenBarn在从Python 3.3开始的注释中指出的,返回值现在传递给StopIteration.
发件人:
在生成器中,语句
return value
在语义上等同于
raise StopIteration(value)
是的,它仍然是一台发电机。空的
返回值
或无返回值
可用于结束发电机功能。这相当于引发一个StopIteration
(有关详细信息,请参阅)
请注意,在3.3之前的Python版本中,带有非None参数的返回是一个SyntaxError
正如@BrenBarn在从Python 3.3开始的注释中指出的,返回值现在传递给StopIteration.
发件人:
在生成器中,语句
return value
在语义上等同于
raise StopIteration(value)
有一种方法可以实现在函数中使用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
def six(多少个=无):
如果“有多少”为无或“有多少”小于1:
返回无#返回值
如果数量=1:
返回6#返回值
def iter_func():
对于范围内的计数(数量):
收益率6
返回iter_func()#返回生成器
有一种方法可以实现在函数中使用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
def six(多少个=无):
如果“有多少”为无或“有多少”小于1:
返回无#返回值
如果数量=1:
返回6#返回值
def iter_func():
对于范围内的计数(数量):
收益率6
返回iter_func()#返回生成器
注意:下面的示例不会出现StopIteration
异常
def odd(max):
n = 0
while n < max:
yield n
n = n + 1
return 'done'
for x in odd(3):
print(x)
注意:对于下面的示例,您不会得到
StopIteration
异常
def odd(max):
n = 0
while n < max:
yield n
n = n + 1
return 'done'
for x in odd(3):
print(x)
你知道如果
return
有一个参数会发生什么吗?@Zack在Python2.x中,它是一个SyntaxError:SyntaxError:“return”在生成器中带有参数
。Python3.x中允许使用它,但主要用于协同路由-您可以使用yield-coroutine()
(或yield-from-coroutine()
,取决于您使用的异步框架)对其他协同路由进行异步调用,并使用返回值
从协同程序返回您想要返回的任何内容。在Python2.x中,您需要使用类似于raisereturn(value)
的技巧从协同程序返回值。您知道如果Return
有一个参数会发生什么吗?@Zack在Python2.x中,它将是一个语法错误:SyntaxError:“Return”和生成器中的参数
。它在Python3.x中是允许的,但是是prima