Pythonでのnext関数を解説

Python

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()は通常のループでは不要ですが、手動でイテレータの進行を制御したい場合に有用です。

タイトルとURLをコピーしました