Python 无法返回生成器实例。为什么?
我正在使用python 3.5。 当我试图返回一个生成器函数实例时,我得到了一个StopIteration错误。为什么? 这是我的密码: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
>>> 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)
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有趣的是,协同程序的实现也是基于
的收益(实际上,现在它是一个本机操作码)