Python の yield キーワード
このチュートリアルでは、Python での yield
キーワードの目的と使用法について説明します。yield
キーワードは、Python でジェネレーター関数を定義するために使用される Python ステートメントです。yield
ステートメントは、関数の本体内でのみ使用できます。
ジェネレーター関数と通常の関数の主な違いは、ジェネレーター関数に return
ステートメントの代わりに yield
式が含まれていることです。yield
ステートメントは、ジェネレータイテレータと呼ばれる一連の値を出力として生成します。イテレータからの新しい値は、next()
関数または for
ループを使用して取得できます。
next()
関数が呼び出されるたびに、または for
ループが繰り返されるたびに、yield
ステートメントは新しい値を生成または生成し、関数のロケーション実行状態、つまりローカル変数の値を保存します。など。新しい next()
関数の呼び出しまたは反復のたびに、各呼び出しで開始される return
ステートメントとは異なり、yield
ステートメントは最後に保存された状態から再開します。
Python の yield
キーワードのサンプルコード
yield
ステートメントの動作が明確になっているので、次にその使用法とサンプルコードを見てみましょう。大量のデータがあり、それを反復可能なオブジェクトに一度にロードできない場合、またはデータを読み取るためのよりメモリ効率の高い方法が必要であるとします。yield
ステートメントを使用してジェネレーター関数を作成できます。関数は、各反復または next()
関数呼び出しでデータの新しいチャンクを読み取り、生成します。
以下のサンプルコードは、yield
ステートメントを for
ループとともに使用して、Python で単純なジェネレーター関数を作成する方法を示しています。以下のサンプルコードのジェネレーター関数 my_generator()
は、1
から 100
までの新しい番号を生成し、99
が呼び出されるまで機能します。
def my_generator():
for x in range(1, 100):
print("new value is generated!")
yield x
最初に、next()
関数を使用するか、反復によって値を生成するためのジェネレータイテレータオブジェクトが必要になります。
gen_iter = my_generator()
次に、next()
関数を使用してジェネレータイテレータから新しい値を取得しましょう。以下のサンプルコードに示すように、next()
関数を iterator.__next__()
として使用することもできます。
val = next(gen_iter)
print("Value =", val)
val = gen_iter.__next__()
print("Value =", val)
出力:
new value is generated!
Value = 1
new value is generated!
Value = 2
新しい値を取得するもう 1つの方法は、for
ループを使用してジェネレータイテレータオブジェクトを反復処理することです。以下のサンプルコードは、Python でジェネレータイテレータオブジェクトを反復処理する方法を示しています。
for val in gen_iter:
print("Value =", val)
上記のコード例は、ジェネレーター関数で指定された範囲からすべての 99
値を生成します。
以下のサンプルコードに示すように、yield
ステートメントを複数回使用することで、for
ループなしでジェネレーター関数を作成することもできます。
def my_generator():
x = 1
print("new value is generated!")
yield x
x = x + 1
print("new value is generated!")
yield x
x = x + 1
print("new value is generated!")
yield x
それでは、新しいジェネレーター関数を使用して、for
ループを使用してすべての値を生成しましょう。
gen_iter = my_generator()
for val in gen_iter:
print("Value =", val)
出力:
new value is generated!
Value = 1
new value is generated!
Value = 2
new value is generated!
Value = 3