Python 同一函数中的收益率和收益率

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

在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

它还是发电机吗?

是的,它还是发电机。
返回
几乎等同于提升
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