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が出たら終了)
この形式は、ファイルを固定サイズで読み込むときなどに使われます。