Python のジェネレーター
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
# 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__ メソッドを記述する必要はありません)。