Python ジェネレータとジェネレータ式の違い

目次

ジェネレータとジェネレータ式の違いのまとめ

定義方法 複雑さ 役割
ジェネレータ def と yield を使う 複雑なロジック、ループ、条件分岐が書ける 関数を呼び出せば何度でも生成できる
ジェネレータ式 ( )(丸括弧)を使う 単純な計算やフィルタリングに向 一度使い切ると定義し直しが必要

どちらの方法で作っても、得られるのはジェネレータオブジェクトです。

必要な時に1つずつ値を生成し、メモリを節約するという本質的な挙動は全く同じですので、状況に合わせて書きやすい方を選んでOKです。

ジェネレータとは

def キーワードを使い、内部で yield を使用します。

def even_numbers(n):
    for i in range(n):
        if i % 2 == 0:
            yield i  # ここで一時停止して値を返す

gen_func = even_numbers(4)
print(next(gen_func))  # 0
print(next(gen_func))  # 2

メリット:if 文や複数のループなど、複雑な処理を盛り込めます。

ジェネレータ式とは

リスト内包表記の[]を()に変えたものです。簡潔に書けます。

# 0から9までの偶数を生成する式
gen_expr = (i for i in range(10) if i % 2 == 0)

# ジェネレータ式をリストに変換して表示
print(list(gen_expr))  # [0, 2, 4, 6, 8]

使い分けの基準

ジェネレータ式を使うべき時 1行で書けるような単純な処理の時。
別の関数の引数(例:sum() や max())にそのまま渡したい時。
例:total = sum(x**2 for x in range(100))
ジェネレータ(関数)を使うべき時 処理が2行以上になる、または複雑な条件分岐が必要な時。
同じ生成ロジックをプログラム内のあちこちで再利用したい時。

関連の記事

Python ジェネレータ(generator)

△上に戻る