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