イテレータとジェネレータ

Pythonにおいて、イテレータとジェネレータは非常に重要な概念です。これらを理解することで、効率的なプログラムを書くことができます。この記事では、イテレータとジェネレータについて詳しく説明します。

イテレータ

イテレータは、繰り返し処理を行うためのオブジェクトです。具体的には、forループやlist comprehension、map関数などで使用されます。

イテレータを作成するには、次の2つの要素が必要です。

  1. __iter__()メソッドを持つオブジェクト
  2. __next__()メソッドを持つオブジェクト

__iter__()メソッドは、オブジェクト自身を返します。これにより、forループなどでオブジェクトを反復処理できます。

__next__()メソッドは、次の要素を返します。もし、次の要素がない場合は、StopIterationを送出します。

以下は、イテレータの例です。この例では、リストの要素を順番に取得していきます。

class MyIterator: def __init__(self, lst): self.lst = lst self.index = 0 def __iter__(self): return self def __next__(self): if self.index < len(self.lst): result = self.lst[self.index] self.index += 1 return result else: raise StopIteration my_list = [1, 2, 3, 4, 5] my_iterator = MyIterator(my_list) for item in my_iterator: print(item)

この例では、MyIteratorクラスを定義し、__iter__()メソッドと__next__()メソッドを実装しています。MyIteratorクラスのオブジェクトをforループで使用することで、リストの要素を順番に取得しています。

ジェネレータ

ジェネレータは、イテレータを作成するための簡単な方法です。ジェネレータは、yield文を使用して、逐次的に値を返します。

ジェネレータを作成するには、次の方法があります。

  1. 関数内でyield文を使用する
  2. ジェネレータ式を使用する

以下は、ジェネレータの例です。この例では、フィボナッチ数列を生成するジェネレータを定義しています。

def fibonacci(): a, b = 0, 1 while True: yield a a, b = b, a + b fib = fibonacci() for i in range(10): print(next(fib))

この例では、fibonacci()関数を定義し、yield文を使用してフィボナッチ数列を生成しています。fibonacci()関数の呼び出し結果はジェネレータオブジェクトであり、next()関数を使用して値を取得することができます。

ジェネレータは、大量のデータを処理する場合や、メモリの使用量を最小限に抑える場合に有効です。

まとめ

イテレータとジェネレータは、Pythonのプログラミングにおいて非常に重要な概念です。イテレータは、繰り返し処理を行うためのオブジェクトであり、ジェネレータは、イテレータを作成するための簡単な方法です。どちらも、効率的でメモリの使用量を最小限に抑えることができるため、Pythonのプログラミングにおいて広く使用されています。

リンク

Iterators and generators[EN]

/6428432f4fbe46c6a2eaafc2