イテレーターはPythonにおいて、Java開発者にとって直感的でない側面があります。本記事ではPythonにおけるイテレーターの使用方法を解説します。Pythonのイテレーターは記述が簡潔である一方で、最も大きな違いとして次の要素があるかどうかを直接判断できない点があります。イテレーションを終了するには例外をキャプチャするかforループを使用する必要があり、これはJava開発者にとって驚きのポイントかもしれません。
イテラブルオブジェクト
イテラブルオブジェクトとは、forループを使って反復処理を行うことができるオブジェクトを指します。Pythonでは、リスト、タプル、辞書、セットなどのコンテナ型がイテラブルオブジェクトとして機能します。また、文字列やファイルオブジェクトもイテラブルです。イテレーターを取得するには、組み込み関数iter()を使用します。
変数がイテラブルオブジェクトかどうかを判断するには、__iter__()メソッドを持っているかどうかを確認します。これはJavaのイテレーター実装に似ており、特定のインターフェースを実装することでイテレーション能力を得る点と共通しています。
以下に基本的な使用例を示します:
data_collection = [10, 20, 30, 40, 50]
for element in data_collection:
print(element)
イテレーター
イテレーターはイテラブルオブジェクトを走査するためのツールです。基本的なメソッドとして__iter__()と__next__()の2つがあります。__iter__()メソッドはイテレーター自体を返し、__next__()メソッドは次の要素を返します。しかし、イテレーターがさらに要素を持たない場合、__next__()メソッドはStopIteration例外を発生させます。
以下に、イテレーターを使用してイテラブルオブジェクトを走査する例を示します:
user_info = {"氏名": "田中", "年齢": 25, "職業": "エンジニア"}
for attribute in iter(user_info):
print(attribute)
通常、イテラブルオブジェクトの走査にはforループが使用されますが、whileループを使用する場合はStopIteration例外を処理する必要があり、注意が必要です。以下にその例を示します:
product_catalog = {"商品A": 1000, "商品B": 2000, "商品C": 3000}
item_iterator = iter(product_catalog)
while True:
try:
product = next(item_iterator)
print(product)
except StopIteration:
break
ジェネレーター
Javaとは異なる、Python特有の機能です。ジェネレーターは特殊なイテレーターで、関数とyield文を使用してデータを段階的に生成します。ジェネレーターはyield文を使って要素を一つずつ生成でき、すべての要素を一度に生成する必要はありません。この方法はメモリを節約し、遅延評価を実現します。
理解を深めるための例を以下に示します:
def fibonacci_generator():
a, b = 0, 1
while True:
yield a
a, b = b, a + b
fib = fibonacci_generator()
print(next(fib)) # 出力: 0
print(next(fib)) # 出力: 1
print(next(fib)) # 出力: 1
return文は一度に値を返し、即座に実行を完了します。これに対し、yieldキーワードは複数回値を返すことができ、内部のビジネスロジックを遅延評価できるという強力な機能を持っています。