logo

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


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__ メソッドを記述する必要はありません)。