この記事では、Pythonにおいてイテレータとジェネレータを使ったループ処理について詳しく解説します。具体的なコード例、その解説、さらに応用例までを含めて説明します。理解して使いこなすことで、より効率的なプログラミングが可能になります。
イテレータとは
イテレータとは、要素を順番に取り出すことができるオブジェクトのことです。Pythonでは`for`ループで繰り返し処理をする際に、イテレータが底で働いています。
イテレータの基本
イテレータオブジェクトは、`__iter__()`メソッドと`__next__()`メソッドを持つ必要があります。以下はシンプルなイテレータの例です。
class MyIterator:
def __init__(self, data):
self.data = data
self.index = 0
def __iter__(self):
return self
def __next__(self):
if self.index >= len(self.data):
raise StopIteration
value = self.data[self.index]
self.index += 1
return value
この例では、`MyIterator`クラスは`__iter__()`と`__next__()`メソッドを持っており、独自のイテレータを定義しています。
ジェネレータとは
ジェネレータは、イテレータをより簡単に作成するための仕組みです。関数内部で`yield`キーワードを使用することで、ジェネレータ関数を定義します。
ジェネレータの基本
ジェネレータは`yield`を使ってデータを一つずつ返します。以下はジェネレータの基本的な使い方です。
def my_generator():
yield 1
yield 2
yield 3
gen = my_generator()
for i in gen:
print(i)
このコードでは、1, 2, 3という3つの数値を順番に返すジェネレータを定義しています。
応用例
フィボナッチ数列
イテレータやジェネレータは、計算結果を逐次返すような場合に特に有用です。たとえば、フィボナッチ数列を生成するプログラムが考えられます。
def fibonacci(n):
a, b = 0, 1
for _ in range(n):
yield a
a, b = b, a + b
ファイルの行読み込み
大きなファイルを行ごとに読み込む場合、ジェネレータを使用するとメモリ効率が良くなります。
def read_large_file(file_path):
with open(file_path, 'r') as f:
for line in f:
yield line.strip()
無限シーケンス
ジェネレータを使うと、無限のシーケンスを表現することもできます。例えば、自然数の生成などです。
def natural_numbers():
n = 1
while True:
yield n
n += 1
まとめ
Pythonのイテレータとジェネレータは、ループ処理をより効率的かつ可読性高く書くための強力なツールです。特にジェネレータは、メモリ効率を考慮しながら大量のデータを扱う際に有用です。この知識を活用して、更に高度なプログラミングを行いましょう。
コメント