目次
ジェネレータとジェネレータ式の違いのまとめ
| 定義方法 | 複雑さ | 役割 | |
|---|---|---|---|
| ジェネレータ | 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行以上になる、または複雑な条件分岐が必要な時。 同じ生成ロジックをプログラム内のあちこちで再利用したい時。 |
関連の記事
