最近、yieldコードを使用する多くのpythonコードに遭遇しました。つまり、関数はジェネレーターです。どういう意味ですか?
関数がyieldを使用してstatementを定義する場合、その関数は通常の関数ではなくジェネレーターです。つまり、関数は反復可能なオブジェクトです。
次のコードを見てください。
def yield_test(n):
for i in range(n):
yield callMe(i) #a
print("i=",i) #b
print("something else")
print("end.")
def callMe(i):
return i*i
for i in yield_test(3):
print(i)
関数yield_testが初めて呼び出されるとき、定義された関数のコードは他のメソッドのようにメソッド全体を順番に実行しませんが、ステートメントyield(場所a)が実行されると、後続の関数呼び出しの結果が返されます。
次に、2回目にforが実行されると、関数は位置bから直接開始され、yieldステートメントに出会った後、forステートメントに戻ります。forステートメントが順番に実行されます。
試験結果は次のとおりです。
0
i= 0
1
i= 1
4
i= 2
something else
end.
ジェネレーターは、反復可能なオブジェクトとして直接呼び出すこともできます。yield_test(3).yield_test(3)._ next_()(python3.xは、以前はnext()関数でした)、各呼び出しは値を返します。
ジェネレータを使用する利点は次のとおりです。
- ジェネレーターは関数を反復可能なオブジェクトに変換し、毎回呼び出し元に値を返し、メモリ消費を削減します(同じ問題はジェネレーターを必要とせず、リストを使用してデータを格納し、呼び出し元に戻る必要がある場合があります)。
- ジェネレーターの2回目の反復では、関数がスタックしているように、yieldステートメントの前の変数の値が保存され、2回目は関数の最初の行から再開するのではなく、残りのコードを実行し続けます。