Python の iter() と next() の基本

iter()next() は、イテレータを手動で操作するための組み込み関数です。for 文では自動的に呼び出されますが、手動で使うことで細かい制御が可能になります。

iter() の基本

iter() はイテラブルからイテレータを生成します。

numbers = [10, 20, 30]
it = iter(numbers)

print(type(it))  # <class 'list_iterator'>

内部的には、オブジェクトの __iter__() メソッドを呼び出しています。

next() の基本

next() はイテレータから次の要素を取り出します。

numbers = [10, 20, 30]
it = iter(numbers)

print(next(it))  # 10
print(next(it))  # 20
print(next(it))  # 30

要素がなくなると StopIteration 例外が発生します。

print(next(it))  # StopIteration が発生

next() のデフォルト値

next() の第2引数にデフォルト値を指定すると、要素がなくなっても例外が発生しません。

numbers = [1, 2]
it = iter(numbers)

print(next(it, 0))  # 1
print(next(it, 0))  # 2
print(next(it, 0))  # 0(デフォルト値)
print(next(it, 0))  # 0(デフォルト値)

これはループの終了判定などに便利です。

実用例:先頭要素のスキップ

イテレータを使えば、先頭の要素をスキップして処理できます。

lines = ["header", "data1", "data2", "data3"]
it = iter(lines)

next(it)  # ヘッダーをスキップ

for line in it:
    print(line)
# data1
# data2
# data3

iter() の2引数形式

iter() には特殊な2引数形式があります。第1引数に呼び出し可能オブジェクト、第2引数に終了値を指定します。

import random

# 0が出るまでランダムな数を生成
it = iter(lambda: random.randint(0, 5), 0)

for n in it:
    print(n, end=" ")
# 例: 3 2 5 1 4 2(0が出たら終了)

この形式は、ファイルを固定サイズで読み込むときなどに使われます。