Python のジェネレーターは、Yield キーワードを使用してイテレーターを返す関数です。この記事では、Python でジェネレーター関数がどのように機能するかについて説明します。
Python のジェネレーター関数
Python のジェネレーター関数は通常の関数のように定義されますが、値を生成する必要がある場合は常に、 利回りキーワード 返すのではなく。 def の本体に yield が含まれている場合、関数は自動的に Python ジェネレーター関数になります。
Python でジェネレーターを作成する
Python では、def キーワードと yield キーワードを使用するだけでジェネレーター関数を作成できます。ジェネレーターの構文は次のとおりです。 パイソン :
def function_name(): yield statement>
例:
この例では、3 つの整数を生成する単純なジェネレーターを作成します。次に、Python を使用してこれらの整数を出力します。 for ループ 。
Python3
# A generator function that yields 1 for first time,> # 2 second time and 3 third time> def> simpleGeneratorFun():> >yield> 1> >yield> 2> >yield> 3> > # Driver code to check above generator function> for> value>in> simpleGeneratorFun():> >print>(value)> |
>
>
出力:
1 2 3>
ジェネレーターオブジェクト
Python ジェネレーター関数は、反復可能なジェネレーター オブジェクトを返します。つまり、 イテレーター 。ジェネレーター オブジェクトは、ジェネレーター オブジェクトの next メソッドを呼び出すか、for in ループでジェネレーター オブジェクトを使用することによって使用されます。
例:
この例では、Python で単純なジェネレーター関数を作成し、 next() 関数 。
Python3
# A Python program to demonstrate use of> # generator object with next()> > # A generator function> def> simpleGeneratorFun():> >yield> 1> >yield> 2> >yield> 3> > # x is a generator object> x>=> simpleGeneratorFun()> > # Iterating over the generator object using next> > # In Python 3, __next__()> print>(>next>(x))> print>(>next>(x))> print>(>next>(x))> |
>
>
出力:
1 2 3>
例:
この例では、フィボナッチ数の 2 つのジェネレーターを作成します。1 つ目は単純なジェネレーターで、2 つ目は、 for ループ 。
Python3
Javaのwhileループ
# A simple generator for Fibonacci Numbers> def> fib(limit):> > ># Initialize first two Fibonacci Numbers> >a, b>=> 0>,>1> > ># One by one yield next Fibonacci Number> >while> a yield a a, b = b, a + b # Create a generator object x = fib(5) # Iterating over the generator object using next # In Python 3, __next__() print(next(x)) print(next(x)) print(next(x)) print(next(x)) print(next(x)) # Iterating over the generator object using for # in loop. print('
Using for in loop') for i in fib(5): print(i)> |
>
>
出力:
0 1 1 2 3 Using for in loop 0 1 1 2 3>
Python ジェネレーター式
Python では、ジェネレーター式はジェネレーター関数を記述する別の方法です。 Pythonを使用します リストの内包表記 ただし、要素をメモリ内のリストに保存する代わりに、ジェネレーター オブジェクトを作成します。
ジェネレータ式の構文
Python のジェネレーター式の構文は次のとおりです。
(expression for item in iterable)>
例:
この例では、2 で割り切れる 0 ~ 5 の範囲内の 5 の倍数を出力するジェネレーター オブジェクトを作成します。
Python3
# generator expression> generator_exp>=> (i>*> 5> for> i>in> range>(>5>)>if> i>%>2>=>=>0>)> > for> i>in> generator_exp:> >print>(i)> |
>
>
出力:
0 10 20>
Python でのジェネレーターのアプリケーション
フィボナッチ数のストリームを作成するとします。ジェネレーターのアプローチを採用すると、それが簡単になります。数値の流れがどこでいつ終わるかを気にせずに、次のフィボナッチ数を取得するには next(x) を呼び出すだけで済みます。より実用的なタイプのストリーム処理は、ログ ファイルなどの大きなデータ ファイルを処理することです。ジェネレーターは、特定の時点でファイルの一部のみが処理されるため、このようなデータ処理にスペース効率の高い方法を提供します。これらの目的で Iterator を使用することもできますが、Generator を使用すると簡単な方法が提供されます (ここで __next__ メソッドと __iter__ メソッドを記述する必要はありません)。