72

Python 2 では、関数定義で return が yield と一緒にあるとエラーが発生しました。しかし、Python 3.3 のこのコードでは

def f():
  return 3
  yield 2

x = f()
print(x.__next__())

yield を伴う関数で return を使用してもエラーはありません。ただし、関数__next__が呼び出されると、例外 StopIteration がスローされます。戻り値だけがないのはなぜ3ですか?このリターンはどういうわけか無視されていますか?

4

2 に答える 2

42

戻り値は無視されませんが、ジェネレーターは値を生成するだけreturnで、この場合は早期にジェネレーターを終了します。その場合、ジェネレーターを進めてもyieldステートメントに到達することはありません。

イテレータが生成する値の「最後」に到達するたびに、 a を発生させる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))
于 2013-05-27T20:18:10.697 に答える