サイトアイコン アマチュア無線局JS2IIU

【Python】ジェネレータの使い方:メモリ効率の良いイテレーション

こんにちは、JS2IIUです。
Pythonのジェネレータは、メモリ効率の良いイテレーションを実現するための強力なツールです。この記事では、ジェネレータの基本から応用まで、サンプルコードを交えながら解説します。今回もよろしくお願いします。

ジェネレータとは?

ジェネレータは、イテレータを生成するための特別な関数です。通常の関数がreturn文で値を返すのに対し、ジェネレータはyield文を使って値を返します。yield文が呼び出されると、ジェネレータの状態が一時停止し、呼び出し元に値が返されます。次にジェネレータが呼び出されると、一時停止した状態から処理が再開されます。

ジェネレータのメリット

ジェネレータの使いどころ

サンプルコード

1. フィボナッチ数列ジェネレータ

Python
def fibonacci(limit):
    a, b = 0, 1
    while a < limit:
        yield a
        a, b = b, a + b

# ジェネレータを使用
for num in fibonacci(10):
    print(num)

解説:

  1. fibonacci関数は、指定された上限値までのフィボナッチ数列を生成するジェネレータです。
  2. yield aで現在のフィボナッチ数を返します。
  3. a, b = b, a + bで次のフィボナッチ数を計算します。
  4. forループでジェネレータから値を受け取り、出力します。

2. ファイル読み込みジェネレータ

Python
def read_large_file(file_path):
    with open(file_path, 'r') as file:
        while True:
            line = file.readline()
            if not line:
                break
            yield line.strip()

# ジェネレータを使用
for line in read_large_file('large_file.txt'):
    print(line)

解説:

  1. read_large_file関数は、大きなファイルを読み込み、行ごとに返すジェネレータです。
  2. file.readline()で1行ずつ読み込みます。
  3. yield line.strip()で読み込んだ行を返します。
  4. forループでジェネレータから値を受け取り、出力します。

3. 素数生成ジェネレータ

Python
def primes():
    num = 2
    while True:
        if all(num % i != 0 for i in range(2, int(num**0.5) + 1)):
            yield num
        num += 1

# ジェネレータを使用
prime_generator = primes()
for _ in range(10):
    print(next(prime_generator))

解説:

  1. primes関数は、素数を無限に生成するジェネレータです。
  2. all(num % i != 0 for i in range(2, int(num**0.5) + 1))で素数判定を行います。
  3. yield numで素数を返します。
  4. next(prime_generator)でジェネレータから次の素数を受け取り、出力します。

参考WEBサイト

ジェネレータを使いこなして、Pythonプログラミングをさらに効率化しましょう!

ジェネレータについて、さらに応用的な内容を知りたい方はこちらの記事も参考にしてみてください。

最後に、書籍のPRです。
24年9月に出版された「ハイパーモダンPython-信頼性の高いワークフローを構築するモダンテクニック」、Claudio Jolowicz著、嶋田、鈴木訳。開発環境の構築、プロジェクトの管理、テストに関して実践的な内容でとても参考になる一冊です。ぜひ手に取ってみてください。

最後まで読んでいただきありがとうございます。

モバイルバージョンを終了