Pythonのnext()は、イテレータから次の要素を取得するための組み込み関数です。iter()で作成されたイテレータやジェネレータに対して使用されます。
イテレータとは
next()の説明の前にイテレータを説明します。イテレータとは、要素を順番に取り出せるオブジェクトのことです。Pythonのforループやnext関数で使用され、1つずつデータを取り出すことができます。
例えば、リストやタプルなどのイテラブル(繰り返し可能なオブジェクト)を iter() を使ってイテレータに変換できます。
numbers = iter([10, 20, 30]) # リストからイテレータを作成
next()の使い方
イテレータから次の要素を取得
リストをiter()でイテレータに変換し、next()で要素を1つずつ取得できます。
numbers = iter([1, 2, 3])
print(next(numbers)) # 1
print(next(numbers)) # 2
print(next(numbers)) # 3
StopIterationの発生
イテレータに要素がない場合、next()を呼び出すとStopIteration例外が発生します。
numbers = iter([1, 2])
print(next(numbers)) # 1
print(next(numbers)) # 2
print(next(numbers)) # StopIteration発生
デフォルト値を指定
next()の第2引数にデフォルト値を指定すると、要素がない場合に例外を発生させずにデフォルト値を返せます。
numbers = iter([1, 2])
print(next(numbers, 'end')) # 1
print(next(numbers, 'end')) # 2
print(next(numbers, 'end')) # 'end'(StopIterationが発生せずにデフォルト値)
ジェネレータとnext
ジェネレータ(yieldを使った関数)でもnextを使えます。
def my_generator():
yield 10
yield 20
yield 30
gen = my_generator()
print(next(gen)) # 10
print(next(gen)) # 20
print(next(gen)) # 30
ループでの利用
通常、明示的にnextを使うより、forループの方が簡潔です。
numbers = iter([1, 2, 3])
for num in numbers:
print(num)
これはnextを内部的に使っているのと同じ動作をします。
使いみち
nextは以下のような場面で役立ちます。
1. ループの途中で次の要素を取得
例えば、1回目の要素だけ手動で取り出し、その後forループで処理する場合などに使えます。
numbers = iter([1, 2, 3, 4, 5])
first = next(numbers) # 最初の要素を手動で取得
print(f"First: {first}")
for num in numbers: # 残りの要素をループで処理
print(num)
2. カスタムイテレータの制御
nextを使うことで、イテレータの進行を細かく制御できます。
class Counter:
def __init__(self, start=0):
self.count = start
def __iter__(self):
return self
def __next__(self):
self.count += 1
return self.count
counter = Counter(5)
print(next(counter)) # 6
print(next(counter)) # 7
print(next(counter)) # 8
まとめ
- next(iterator)でイテレータの次の要素を取得
- 要素がないとStopIterationが発生
- next(iterator, default)でデフォルト値を設定可能
- ジェネレータ(yield)にも使える
- ループの途中で要素を取り出す場合や、カスタムイテレータの制御、ストリームデータ処理に役立つ
next()は通常のループでは不要ですが、手動でイテレータの進行を制御したい場合に有用です。