Python でイテレーターとジェネレーターを区別する

Jesse John 2023年1月30日
  1. Python のイテレーター
  2. Python のジェネレータ
  3. Python でのイテレーターとジェネレーターの例
  4. まとめ
Python でイテレーターとジェネレーターを区別する

イテレーターとジェネレーターは、出力を生成したり、コードを 1 ビットずつ繰り返し処理したりするのに役立ちます。この記事では、Python のイテレーターとジェネレーターの基本的な違いを簡単な例で学びます。

Python のイテレーター

イテレーターの基本的な機能は次のとおりです。

  1. イテレーターは、イテレータープロトコルを実装するクラスを使用して作成されたオブジェクトです。これは、クラスに __iter__ メソッドと __next__ メソッドが定義されていることを意味します。
  2. __next__ メソッドは、return ステートメントを使用して値を返します。return ステートメントはそのメソッドの最後の行である必要があるため、return ステートメントの前に __next__ の次の実行で使用される変数を更新する必要があります。

最も単純なケースでは、__iter__self を返します。

Python のジェネレータ

ジェネレータの基本的な機能は次のとおりです。

  1. ジェネレーターは機能です。
  2. ジェネレーター関数は、return キーワードの代わりに yield キーワードを使用します。
    2.1 yield キーワードは値を生成し、関数の実行を一時停止します。
    2.2 next() への次の呼び出しは、yield ステートメントの後にコードの実行を再開します。

ジェネレーター関数を使用すると、クラスを使用してイテレーターを作成するときに必要な余分なコードをすべて使用せずに、ジェネレーターイテレーターを作成できます。

Python でのイテレーターとジェネレーターの例

次の 2つの例は、前の 2つのセクションで説明したポイントを強調しています。どちらの例も、1 から始まる整数の 2 乗を生成する方法を示しています。

最初の例は、イテレーターを使用してそれがどのように行われるかを示しています。2 番目の例は、ジェネレーターを使用した同等のコードを示しています。

Iterator のサンプルコード:

# ITERATOR (Class)


class squares(object):
    def __init__(self, num1):
        self.nxt_sq_of = 1
        self.lim = num1

    def __iter__(self):
        return self

    def __next__(self):

        if self.nxt_sq_of <= self.lim:
            ret_sq_of = self.nxt_sq_of
            self.nxt_sq_of += 1
            return ret_sq_of * ret_sq_of
        else:
            raise StopIteration


# Iterator Object
a = squares(6)

# Next value of the iterator.
next(a)
next(a)
next(a)
next(a)
next(a)
next(a)
next(a)
next(a)


# Using the iterator in a loop.
a1 = squares(6)

while True:
    print(next(a1))

出力:

next(a)
Out[3]: 1

next(a)
Out[4]: 4

next(a)
Out[5]: 9

next(a)
Out[6]: 16

next(a)
Out[7]: 25

next(a)
Out[8]: 36

next(a)
Traceback (most recent call last):

  File "<ipython-input-9-15841f3f11d4>", line 1, in <module>
    next(a)

  File "<ipython-input-1-9dbe8e565876>", line 17, in __next__
    raise StopIteration

StopIteration

ジェネレータのサンプルコード:

# GENERATOR FUNCTION


def gen_squares(num2):
    i = 1
    while i <= num2:
        yield i * i
        i += 1


# Generator iterator.
b = gen_squares(5)

# Next yield of the generator iterator.
next(b)
next(b)
next(b)
next(b)
next(b)
next(b)

出力:

next(b)
Out[3]: 1

next(b)
Out[4]: 4

next(b)
Out[5]: 9

next(b)
Out[6]: 16

next(b)
Out[7]: 25

next(b)
Traceback (most recent call last):

  File "<ipython-input-8-adb3e17b0219>", line 1, in <module>
    next(b)

StopIteration

まとめ

Python のジェネレーターを使用すると、ジェネレーターの反復子を作成するための簡潔なコードを記述できることがわかります。

一方、イテレーターは、プログラマーが __iter__ メソッドのカスタムコードを記述できるため、はるかに強力です。

詳細については、以下を参照してください。

  1. ジェネレーターの PythonWiki 記事。
  2. イテレーターの PythonWiki 記事。
著者: Jesse John
Jesse John avatar Jesse John avatar

Jesse is passionate about data analysis and visualization. He uses the R statistical programming language for all aspects of his work.

関連記事 - Python Iterator

関連記事 - Python Generator