0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

pythonのイテレーターとnext() 備忘録

Posted at

Pythonのイテレータとnext()の使い方を詳しく解説!

Pythonでデータ処理を行う際に頻繁に登場する「イテレータ(Iterator)」について、しっかり理解できていますか?この記事では、イテレータと、それを操作するための関数であるnext()について詳しく解説します。


イテレータとは?

イテレータは、**「一度に一つずつ値を取り出せるオブジェクト」**です。イテレータを使うと、巨大なデータセットをメモリを節約しながら処理することができます。

具体的には、以下の2つの条件を満たすオブジェクトがイテレータと呼ばれます:

  1. __iter__()メソッドを持つ
  2. __next__()メソッドを持つ

これらのメソッドによって、イテレータは次の要素を順番に取り出すことができます。


イテラブルとイテレータの違い

Pythonでは、リストやタプル、文字列なども「反復可能(イテラブル)」なオブジェクトですが、これらはイテレータそのものではありません
イテラブルをiter()関数に渡すことで、イテレータを生成できます。

例:

# リストはイテラブル(iterable)
my_list = [1, 2, 3]

# イテレータを生成
my_iterator = iter(my_list)

print(next(my_iterator))  # 出力: 1
print(next(my_iterator))  # 出力: 2
print(next(my_iterator))  # 出力: 3

ポイント

  • イテラブル: 繰り返し処理が可能だが、直接next()を使えない。
  • イテレータ: イテラブルから生成され、next()で要素を一つずつ取り出せる。

next()関数について

next()はイテレータから次の要素を取得するための組み込み関数です。

基本的な使い方:

# イテレータの作成
my_iterator = iter([10, 20, 30])

# 次の要素を取得
print(next(my_iterator))  # 出力: 10
print(next(my_iterator))  # 出力: 20
print(next(my_iterator))  # 出力: 30

StopIteration例外

イテレータの要素をすべて取得した後にnext()を呼び出すと、StopIteration例外が発生します。

例:

my_iterator = iter([1, 2])

print(next(my_iterator))  # 出力: 1
print(next(my_iterator))  # 出力: 2
print(next(my_iterator))  # StopIteration例外

エラーを防ぎたい場合は、next()の第2引数を使うことで、デフォルト値を指定できます:

my_iterator = iter([1, 2])

print(next(my_iterator, "デフォルト値"))  # 出力: 1
print(next(my_iterator, "デフォルト値"))  # 出力: 2
print(next(my_iterator, "デフォルト値"))  # 出力: デフォルト値

カスタムイテレータの作成

Pythonでは、自分でイテレータを作成することも可能です。以下は、1から指定された値までカウントするイテレータの例です:

class Counter:
    def __init__(self, max_count):
        self.current = 1
        self.max_count = max_count

    def __iter__(self):
        return self

    def __next__(self):
        if self.current > self.max_count:
            raise StopIteration
        result = self.current
        self.current += 1
        return result

# イテレータの使用
counter = Counter(5)
for num in counter:
    print(num)  # 出力: 1, 2, 3, 4, 5

イテレータを使うメリット

  1. メモリ効率が良い
    イテレータは必要なときにだけデータを生成するので、メモリ使用量を抑えられます。

  2. 無限のデータ処理が可能
    イテレータは終了条件を持たない無限のシーケンスも表現できます。

例:無限の偶数を生成するイテレータ

def infinite_even_numbers():
    n = 0
    while True:
        yield n
        n += 2

evens = infinite_even_numbers()
print(next(evens))  # 出力: 0
print(next(evens))  # 出力: 2
print(next(evens))  # 出力: 4

まとめ

  • イテレータは、一度に一つの要素を取り出すオブジェクト。
  • next()を使って、イテレータから次の要素を取得できる。
  • カスタムイテレータを作成して柔軟なデータ処理が可能。

イテレータの概念を理解すれば、Pythonのコードがさらに効率的に書けるようになります。ぜひ試してみてください!

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?