Pythonのイテレータの使い方を試した

こんにちは、kisseです。
最近、もしかしたらPythonのイテレータを手動で回す必要に迫られそうだったので、簡単に練習してみました。

イテレータでfor文を回す以外の方法

よく見るのは、以下のようにリストに対してfor文を回すようにする方法です。

dict_list = [
  {'a': 1, 'b': 2},
  {'a': 2, 'b': 4},
  {'a': 3, 'b': 6}
]

for item in dict_list:
  print(item)

こういうところPythonめちゃくちゃ便利ですよね。



上記のfor文による方法と同様の機能を実現する

上記のプログラムのように、リストの全ての要素を出力するような機能を、手動でイテレータを回す感じで書いてみます。

dict_list = [
  {'a': 1, 'b': 2},
  {'a': 2, 'b': 4},
  {'a': 3, 'b': 6}
]

# イテレータを取得
list_iter = iter(dict_list)

while True:
  try:
    # next()で要素を取得
    list_item = next(list_iter)
    print(list_item)
  except StopIteration:
    # 次の要素がないときには、StopIteration Exceptionが投げられる。  
    break

while True: がなんか気持ち悪いですが、このような記述で意図した動作を実現することができます。
ポイントはnext()実行時にリストの最後の要素まで到達していた場合には、StopIteration Exceptionが投げられる点です。
これexceptで受け取ってwhileループを抜ければ良いです。

そもそもイテレータってなんだ?

要素を1個ずつ取り出すことができるデータ構造のことのようです。
今回取り上げたリストや辞書以外にも自分で実装することも可能です。
(これは私が必要に迫られたら、実装して記事化します。今回の案件はそれほどでもないはず。。)

どのように使おう?

今想定している方法は、2つの辞書のリストを特定のカラムで等号結合するような処理に使うことを考えています。
どちらのリストも結合カラムでソート済みの状態なので、ソートマージ法を適用すると高速に計算できるはずなのですが、
それはPythonのfor文で回すよりはうまいことイテレータを使った感じにする方が綺麗なのではと考えています。

ここら辺は実装してみて、上手くいったら記事化しようと思います。



おわり

今回は、for文ではないリストの走査の仕方を書きました。
今後、これを適用したプログラムを実装してみる予定なので上手くいったら記事化します。
最後まで読んでいただきありがとうございます!

あわせて読みたい