Python 无法返回生成器实例。为什么?

Python 无法返回生成器实例。为什么?,python,python-3.x,if-statement,generator,Python,Python 3.x,If Statement,Generator,我正在使用python 3.5。 当我试图返回一个生成器函数实例时,我得到了一个StopIteration错误。为什么? 这是我的密码: >>> def gen(start, end): ... '''generator function similar to range function''' ... while start <= end: ... yield start ... start += 1 ... >>> de

我正在使用python 3.5。 当我试图返回一个生成器函数实例时,我得到了一个StopIteration错误。为什么?

这是我的密码:

>>> def gen(start, end):
... '''generator function similar to range function'''
...    while start <= end:
...       yield start
...       start += 1
...
>>> def check(ingen, flag=None):
...    if flag:
...        for n in ingen:
...            yield n*2
...    else:
...        return ingen
...
>>> # Trigger else clause in check function
>>> a = check(gen(1,3))
>>> next(a)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration: <generator object gen at 0x7f37dc46e828>

当生成器点击其
return
语句(显式或非显式)时,它将引发
StopIteration
。因此,当您
返回ingen
时,您就结束了迭代


check\u v2
不是生成器,因为它不包含
yield
语句,这就是它工作的原因。

当生成器点击其
return
语句(显式或非显式)时,它会引发
StopIteration
。因此,当您
返回ingen
时,您就结束了迭代


check\u v2
不是生成器,因为它不包含
yield
语句,这就是它工作的原因。

在Python中,如果函数中存在
yield
,则Python将其视为生成器。在生成器中,任何返回都将使用返回值引发
StopIteration
。这是Python 3.3中的一个新特性:请参见和
check_v2
之所以有效,是因为它不包含
yield
,因此是一个正常功能

有两种方法可以实现您的目标:

  • 检查
    中的
    返回
    更改为
    收益
  • 让调用者陷阱停止迭代,如下所示

    try:
        next(a)
    except StopIteration as ex:
        print(ex.value)
    

在Python中,如果函数中存在
yield
,则Python将其视为生成器。在生成器中,任何返回都将使用返回值引发
StopIteration
。这是Python 3.3中的一个新特性:请参见和
check_v2
之所以有效,是因为它不包含
yield
,因此是一个正常功能

有两种方法可以实现您的目标:

  • 检查
    中的
    返回
    更改为
    收益
  • 让调用者陷阱停止迭代,如下所示

    try:
        next(a)
    except StopIteration as ex:
        print(ex.value)
    

正如其他人所说,如果您从生成器返回,则意味着生成器已停止生成项目,这将引发
停止迭代
无论您返回什么

这意味着
check
实际上返回一个空迭代器

如果要返回另一个生成器的结果,可以使用
yield from

def check(ingen, flag=None):
    if flag:
        for n in ingen:
            yield n*2
    else:
        yield from ingen

正如其他人所说,如果您从生成器返回,则意味着生成器已停止生成项目,这将引发
StopIteration
无论您返回什么

这意味着
check
实际上返回一个空迭代器

如果要返回另一个生成器的结果,可以使用
yield from

def check(ingen, flag=None):
    if flag:
        for n in ingen:
            yield n*2
    else:
        yield from ingen
见:

在生成器中,语句

return value
在语义上等同于

raise StopIteration(value)
除此之外,与当前一样,
except无法捕获异常
返回生成器中的子句

这是Python 3.3中的一项新功能。

请参见:

在生成器中,语句

return value
在语义上等同于

raise StopIteration(value)
除此之外,与当前一样,
except无法捕获异常
返回生成器中的子句


这是Python 3.3中的一个新功能。

@martineau它在Python中很好3@wroniasty:从我刚刚读到的内容来看,只有在Python 3.3+@martineau中才可以3@wroniasty:从我刚刚读到的内容来看,只有在Python 3.3+中才行,谢谢你让我看到了
语法中产生的结果+1有趣的是,协同程序也是通过
yield from
实现的(实际上,现在它是一个本机操作码),感谢您让我看到
yield from
语法+1有趣的是,协同程序的实现也是基于
收益(实际上,现在它是一个本机操作码)