Python ジェネレーターの理解

Zeeshan Afridi 2023年6月21日
  1. Python のジェネレーター
  2. Python ジェネレーターの理解
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 Afridi
Zeeshan Afridi avatar Zeeshan Afridi avatar

Zeeshan is a detail oriented software engineer that helps companies and individuals make their lives and easier with software solutions.

LinkedIn

関連記事 - Python Generator