Pythonのジェネレーターとは何ですか?yieldは何をしますか?

最近、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回目は関数の最初の行から再開するのではなく、残りのコードを実行し続けます。
89の元の記事を公開 賞賛83 訪問3484

おすすめ

転載: blog.csdn.net/devin_xin/article/details/105639892