イテレータ(Iterators)は、コレクション(リスト、タプル、辞書、集合など)の要素を順にアクセスするためのオブジェクトです。イテレータは__iter__()
および__next__()
という特別なメソッドを持ち、これらを実装することで反復処理が可能になります。Pythonのイテレータは、メモリ効率が良く、コレクション全体を一度にメモリに読み込まずに要素を順次処理できます。
基本概念
- イテラブル(Iterable):
- イテレータを返す
__iter__()
メソッドを持つオブジェクトです。リスト、タプル、文字列などのコレクションはすべてイテラブルです。
- イテレータを返す
- イテレータ(Iterator):
__next__()
メソッドを持つオブジェクトで、次の要素を返します。要素がなくなるとStopIteration
例外を送出します。
__iter__()
メソッド:- イテレータオブジェクトを返します。通常、イテラブルオブジェクトでこれを呼び出してイテレータを取得します。
__next__()
メソッド:- 次の要素を返します。要素がない場合、
StopIteration
例外を送出します。
- 次の要素を返します。要素がない場合、
基本例
リストをイテレータとして使用
my_list = [1, 2, 3, 4] my_iter = iter(my_list) print(next(my_iter)) # 出力: 1 print(next(my_iter)) # 出力: 2 print(next(my_iter)) # 出力: 3 print(next(my_iter)) # 出力: 4 # print(next(my_iter)) # ここでStopIteration例外が発生します
カスタムイテレータの作成
自作のイテレータクラス
class MyIterator: def __init__(self, start, end): self.current = start self.end = end def __iter__(self): return self def __next__(self): if self.current >= self.end: raise StopIteration else: self.current += 1 return self.current - 1 # 使用例 my_iter = MyIterator(1, 5) for num in my_iter: print(num)
出力:
1 2 3 4
イテレータの利点
- メモリ効率: イテレータは一度に一つの要素を処理するため、メモリ使用量が少なくて済みます。
- 遅延評価: 必要になるまで要素を生成しないため、計算量の削減やパフォーマンスの向上につながります。
- 無限シーケンスの処理: 終了条件を持たないシーケンス(例えば、無限の数列)を扱うことができます。
実用例
ファイルの行をイテレートする
with open('example.txt', 'r') as file: for line in file: print(line.strip())
ジェネレータによるイテレータ
ジェネレータは、イテレータを作成するための簡便な方法です。関数内でyield
キーワードを使用して値を生成します。
def my_generator(start, end): current = start while current < end: yield current current += 1 for num in my_generator(1, 5): print(num)
これらの資料を参考にすることで、Pythonのイテレータとその応用についてさらに深く理解することができます。イテレータはPythonの強力な機能の一つであり、効果的に使用することで、コードの効率性と可読性を向上させることができます。