Python ジェネレーターの理解
ジェネレーター内包表記は、Python でジェネレーターを作成するスマートで効率的な方法です。 その構文を理解して効率的にコーディングするために不可欠な、ジェネレーターを定義する単一行の仕様です。
この記事では、Python のジェネレーターとジェネレーター内包表記を例とともに学習します。
Python のジェネレーター
Python のジェネレーターは、アイテムを一度にトラバースするイテレーターを作成するために使用される反復可能オブジェクトまたはトラバーサル オブジェクトを返す関数です。 ジェネレーターは、定義済みの iter() および next() 関数を使用してイテレーターを作成し、内部状態を追跡する単純で簡単な方法であり、StopInteration 例外も処理します。
Python でイテレーションを作成するのは非常に複雑ですが、iter() および next() 関数を定義して実装する必要があります。 そうするのは長いプロセスですが、ジェネレーターのおかげです。
Python のジェネレーターの例を見てみましょう。
# A simple generator function def my_gen(): n = 1 print(f"This is line number {n}") # generator function always contains the 'yield' Keyword yield n n += 1 print(f"This is line number {n}") yield n n += 1 print(f"This is line number {n}") yield n print(my_gen()) 出力:
<generator object my_gen at 0x00000150EA43E448> 上記の関数で yield を使用して、値をジェネレーターに変換しました。 my_gen() 関数を出力すると、ジェネレーターの反復処理に使用できる関数のオブジェクトが得られました。
ジェネレーターを反復処理する例を見てみましょう。
def even_nums(): # create generator for i in range(11): if i % 2 == 0: yield i print("This is the generator object of the generator function:", even_nums()) # iterate over the generator function print("\nEven number from 0 to 11") for i in even_nums(): print(i, end=", ") 出力:
This is the generator object of the generator function: <generator object even_nums at 0x05ACC2D0> Even number from 0 to 11 0, 2, 4, 6, 8, 10, Python ジェネレーターの理解
ジェネレータ内包表記は、Python のリスト内包表記に似ています。 ただし、括弧と角括弧によって区別されます。 Python のジェネレーター内包表記を使用して、無名関数を作成するラムダ関数と同様に機能する単純なジェネレーターを簡単に作成できます。
ジェネレーター内包表記とリスト内包表記の違いは、ジェネレーター内包表記では 1つの項目が同時に作成されるのに対し、リスト内包表記ではリスト全体が同時に作成されることです。 ジェネレータ内包表記ははるかに高速で、メモリ効率が高くなります。
Python でのジェネレータ内包表記の例を見てみましょう。
# generator comprehension in python # take the square of each number from 1-6 and store it in 'gen' gen = (x ** 2 for x in range(1, 6)) print(gen) # return --> generator object # iterate over the generator 'gen' for i in gen: print(i, end=", ") 出力:
<generator object <genexpr> at 0x00000150EA43EC48> 1, 4, 9, 16, 25, 上記のコード例では、ジェネレーター式はオンデマンドで必要な結果を生成しましたが、すぐには生成しませんでした。 後でforループを使用してジェネレーターを反復処理するために使用したジェネレーターのオブジェクトを返しました。
ジェネレーターが値の順序と状態を処理するため、next() 関数を使用して、ジェネレーターの各値を順番に出力できます。
# generator comprehension in python # take the square of each number from 1-6 and store it in 'gen' gen = (x ** 2 for x in range(1, 6)) # next() print(next(gen)) print(next(gen)) print(next(gen)) print(next(gen)) print(next(gen)) 出力:
1 4 9 16 25 ご覧のとおり、next() を使用してオンデマンドの値を取得しており、各 next() 関数の後に次の値を取得しているため、一連の値を処理しています。
Zeeshan is a detail oriented software engineer that helps companies and individuals make their lives and easier with software solutions.
LinkedIn