Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonのイテレータとは?__iter__()と__next__()の基本を解説

Pythonでは、リストやタプルなどのコンテナオブジェクトに対して「反復処理(イテレーション)」を行う仕組みが用意されています。イテレータの中核となるのは、__iter__()__next__() という2つの特殊メソッドです。この2つを実装することで、ユーザー定義クラスでも反復処理に対応させることができます。

__iter__() メソッド

__iter__() メソッドは、イテレータオブジェクトそのものを返す役割を担います。for文などでオブジェクトを反復処理する際、最初にこのメソッドが呼び出されます。なお、1つのクラスで複数種類の反復処理をサポートしたい場合は、用途に応じた別のメソッドを追加して実装することも可能です。

__next__() メソッド

__next__() メソッドは、コンテナから次の要素を1つずつ取り出して返します。すべての要素を取り出し終えたタイミングで StopIteration 例外を発生させることで、「反復処理の終了」をPython側に伝えます。この例外が正しく送出されないと、無限ループに陥る原因になるため注意が必要です。

実装例:べき乗を返すイテレータ

以下は、1から指定した最大値までの数値 x に対して x の x 乗(x^x)を順番に返すカスタムイテレータの例です。

class PowerIter:
   # 1〜max の範囲の x に対して x ^ x を返す
   def __init__(self, max=0):
      self.max = max  # イテレータの上限値を設定

   def __iter__(self):
      self.term = 0   # カウンタを初期化
      return self     # イテレータ自身を返す

   def __next__(self):
      if self.term <= self.max:
         element = self.term ** self.term
         self.term += 1
         return element
      else:
         raise StopIteration  # 上限を超えたら例外を発生させて終了

powIterObj = PowerIter(10)
powIter = iter(powIterObj)
for i in range(10):
   print(next(powIter))

実行結果

上記のコードを実行すると、0^0 から始まり各数値のべき乗が順に出力されます。

1
1
4
27
256
3125
46656
823543
16777216
387420489

まとめ

イテレータを実装する際のポイントは以下の2点です。

  • __iter__():自分自身(または別のイテレータオブジェクト)を返す
  • __next__():次の要素を返し、要素が尽きたら StopIteration を発生させる

この仕組みを理解すると、for文の内部動作やジェネレータとの違いも把握しやすくなります。独自のデータ構造に対して反復処理を持たせたい場合に、ぜひ活用してみてください。

  1. Python Kivy入門:ボタンアクション(イベント処理)の実装方法

    Kivyは、マルチタッチアプリなど革新的なユーザーインターフェースを持つアプリケーションを迅速に開発するためのオープンソースのPythonライブラリです。Androidアプリだけでなく、デスクトップアプリケーションの開発にも広く活用されています。本記事では、Kivyにおいてボタンが押されたときにイベントを発生させる方法について解説します。実装例:ボタンとラベルの連動以下の例では、水平方向のBoxLayoutの中にボタンとラベルを1つずつ配置しています。まず、ボタンとラベルにそれぞれ初期テキストを設定します。その後、ボタンをクリックした際に発火するイベントを作成し、このイベントによってボタンとラ

  2. Pythonの継承とは?単一継承と階層継承の基本をサンプルコードで解説

    本記事では、Python 3.xにおける継承(インヘリタンス)とクラスの拡張方法について詳しく解説します。 継承とは、現実世界のモノや概念の関係性を自然に表現できる、オブジェクト指向プログラミングの中核となる仕組みです。継承を活用すると、次のようなメリットが得られます。 再利用性:すでに書いたコードを流用でき、重複を削減できる 推移性:クラス間の関係を連鎖的に引き継げる 開発速度の向上:ゼロから書かずに済むため、短期間で開発できる 保守性・拡張性:既存クラスを壊さずに機能を追加しやすい 継承の5つの種類 Pythonの継承は、その構造によって主に以下の5種類に分類されます。 単一継承(