この記事では、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で非常に強力なツールです。メモリ効率、遅延評価、状態の保持など、多くの面で優れています。この機能を使いこなすことで、より効率的なコードを書くことができるでしょう。
コメント