Pythonでは、関数内でyield
を使用すると、その関数はジェネレータとして動作します。ジェネレータは、関数の状態を保持しながら値を呼び出し元に返すことができます。
yield
とreturn
の主な違いは、return
が関数の処理を終了し、値を返すのに対し、yield
は関数の処理を一時停止し、値を返します。そして、その関数が再度呼び出されると、yield
の次の行から処理が再開されます。
def func():
a = 10
b = 20
c = a + b
yield c # ここで一旦停止
a = 100
b = 200
c = a + b
yield c # ここで一旦停止
a = 1000
b = 2000
c = a + b
yield c # ここで一旦停止
for x in func():
print(x)
上記のコードでは、yield
がなくなるまでfor
文が回り続けます。for
文の裏側で「処理(yield
まで) ⇒ 一旦停止 ⇒ 再開(yield
まで) ⇒ 一旦停止」が繰り返され、その都度、yield
の返す値がx
に代入されます。
また、Python 3では、ジェネレータ内でreturn
を使用すると、StopIteration
例外が発生します。これは、yield
とreturn
の併用が難しいことを示しています。しかし、yield from
を使用すると、return
に設定した値を取得することができます。
def buzz():
i = 0
for j in range(10):
i += j
yield j
return i
def getter():
x = yield from buzz()
yield x
for x in getter():
print(x)
このように、Pythonのyield
とreturn
を理解し、適切に活用することで、より効率的なコードを書くことができます。