生成器中的 return 与 Yield 一起
- 2025-01-17 09:23:00
- admin 原创
- 105
问题描述:
在 Python 2 中,当它在函数定义中return
同时出现时会导致错误。但对于 Python 3.3 中的以下代码:yield
def f():
return 3
yield 2
x = f()
print(x.__next__())
return
在函数中使用时没有错误。但是当调用yield
该函数时会抛出异常。为什么不只是返回值?这是否被忽略了?__next__
`StopIteration3
return`
解决方案 1:
这是 Python 3.3 中的新功能。就像return
长期以来生成器中的 等同于一样raise StopIteration()
,return <something>
生成器中的 现在等同于raise StopIteration(<something>)
。因此,您看到的异常应打印为StopIteration: 3
,并且可以通过异常对象上的属性访问该值value
。如果使用(也是新的)语法委托生成器yield from
,则它就是结果。有关详细信息,请参阅PEP 380。
def f():
return 1
yield 2
def g():
x = yield from f()
print(x)
# g is still a generator so we need to iterate to run it:
for _ in g():
pass
这可以打印1
,但是不能2
。
解决方案 2:
返回值不会被忽略,但生成器只会产生值,return
在这种情况下,生成器会提前结束。yield
在这种情况下,继续执行生成器永远不会到达语句。
每当迭代器到达要产生的值的“末尾”时,StopIteration
必须引发。生成器也不例外。但是从 Python 3.3 开始,任何return
表达式都将成为异常的值:
>>> def gen():
... return 3
... yield 2
...
>>> try:
... next(gen())
... except StopIteration as ex:
... e = ex
...
>>> e
StopIteration(3,)
>>> e.value
3
使用next()
函数来推进迭代器,而不是.__next__()
直接调用:
print(next(x))
相关推荐
热门文章
项目管理软件有哪些?
热门标签
云禅道AD