Pythonでジェネレータ関数とyieldキーワードを理解しよう

この記事では、Pythonのジェネレータ関数とyieldキーワードの使い方について詳しく解説します。ジェネレータ関数はメモリの効率的な使用や遅延評価に有用なPythonの高度な特性です。具体的なコード例、その詳細解説、そして応用例を多数紹介します。

目次

ジェネレータ関数とは?

ジェネレータ関数とは、Pythonの特殊な種類の関数です。通常の関数が一度呼び出されると処理を最後まで実行し、結果を返すのに対して、ジェネレータ関数は一時停止と再開が可能です。これは、`yield`キーワードを使用して実現されます。

メモリ効率

ジェネレータ関数はイテレータを返すので、全てのデータをメモリに格納する必要がありません。これは、大量のデータを扱う際に特に有用です。

# ジェネレータ関数の例
def count_up_to(max):
    count = 1
    while count <= max:
        yield count  # 一時停止とデータの生成
        count += 1

遅延評価(Lazy Evaluation)

ジェネレータは、データが必要になるまでその評価を遅延させます。これにより、パフォーマンスが向上します。

yieldキーワードの基本

`yield`キーワードは、ジェネレータ関数内で使用され、関数の実行を一時停止させるとともに、値を外部に送出します。

# yieldの基本的な使い方
def simple_gen():
    yield 'Hello'
    yield 'World'

gen = simple_gen()
print(next(gen))  # 出力: Hello
print(next(gen))  # 出力: World

応用例

ファイルの逐次読み込み

大きなファイルを一行ずつ読み込む場合、ジェネレータ関数を使用するとメモリ効率が良くなります。

# ファイルを一行ずつ読むジェネレータ関数
def read_large_file(file_path):
    with open(file_path, 'r') as f:
        for line in f:
            yield line.strip()

フィボナッチ数列

フィボナッチ数列を生成するジェネレータ関数も作成可能です。

# フィボナッチ数列を生成するジェネレータ関数
def fibonacci_gen(n):
    a, b = 0, 1
    for _ in range(n):
        yield a
        a, b = b, a + b

状態を持つジェネレータ関数

ジェネレータ関数は状態を持つことができます。例えば、乱数を生成しつつ、その状態を保持できます。

# 乱数を生成するジェネレータ関数
import random

def random_gen(seed):
    random.seed(seed)
    while True:
        yield random.randint(0, 100)

まとめ

ジェネレータ関数と`yield`キーワードは、Pythonで非常に強力なツールです。メモリ効率、遅延評価、状態の保持など、多くの面で優れています。この機能を使いこなすことで、より効率的なコードを書くことができるでしょう。

コメント

コメントする

目次