Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonでジェネレーターを使ってイテレーターを作成できる?yieldの基本と実装方法を解説

はい、Pythonではジェネレーターを使用してイテレーターを作成できます。ジェネレーターはyieldキーワードを使うことで簡単に定義でき、イテレーターとして振る舞う関数を宣言するための仕組みです。

Pythonのジェネレーターは、イテレーターを手軽に作成するためのシンプルな方法であり、主にイテレーターのように動作する関数を宣言する際に使われます。

ジェネレーターとは、一度に1つの値ずつ順番に取り出しながら反復処理(イテレーション)を行える関数のことです。日々のプログラミングでは、リスト、文字列、辞書(dict)などのイテラブルオブジェクトを頻繁に利用します。

イテレーターとは、ループ処理によって順番に要素を取り出すことができるオブジェクトのことです。

次の例では、Pythonのジェネレーターにyield文を導入しています。yieldは値を返すような働きをしますが、通常のreturnと異なり、関数の実行状態を保持したまま一時停止し、次に呼び出されたときに続きから再開できる点が特徴です。

例:yieldを使ったジェネレーターの定義

def generator():
    print("プログラムが正常に動作しています")
    yield 'x'
    yield 'y'
    yield 'z'

generator()

出力結果

<generator object generator at 0x000000CF81D07390>

ジェネレーター関数をそのまま呼び出しても、中の処理は実行されず、ジェネレーターオブジェクトが返されるだけです。実際に値を取り出すには、forループやnext()関数を使用します。

forループでジェネレーターから値を取得する

for i in generator():
    print(i)

出力結果

プログラムが正常に動作しています
x
y
z

イテレーターのプロトコル:__iter__メソッドと__next__メソッド

イテレーターオブジェクトは、次の2つのメソッドをサポートしています。

  1. __iter__メソッド
  2. __next__メソッド

__iter__メソッドは、イテレーターオブジェクト自身を返します。主にforループやin演算子の内部で使用されます。

__next__メソッドは、イテレーターから次の値を返します。取り出せる要素がなくなった場合は、StopIteration例外を発生させる必要があります。

例:独自のイテレータークラスを実装する

class Counter(object):
    def __init__(self, lowtemp, hightemp):
        self.current = lowtemp
        self.high = hightemp

    def __iter__(self):
        '自分自身をイテレーターオブジェクトとして返す'
        return self

    def __next__(self):
        'currentがhigh以下である限り、次の値を返す'
        if self.current > self.high:
            raise StopIteration
        else:
            self.current += 1
            return self.current - 1

c = Counter(3, 20)
for i in c:
    print(i, end=' ')

出力結果

3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20

このように、クラスに__iter__と__next__を実装すれば独自のイテレーターを作成できますが、yieldを使ったジェネレーターの方が、はるかに少ないコード量で同じ機能を実現できます。単純な反復処理にはジェネレーターを、より複雑な状態管理が必要な場合にはクラスベースのイテレーターを使い分けるとよいでしょう。

  1. PythonのMatplotlibでヒストグラムを作成する方法をわかりやすく解説

    Matplotlibは、データ可視化のために広く使われている人気のPythonライブラリです。データの可視化は非常に重要なステップです。数値を一つずつ確認したり複雑な計算を行ったりしなくても、データ全体の傾向や特徴を直感的に把握できるようになるからです。また、定量的な洞察を効果的に伝える手段としても優れています。MatplotlibとはMatplotlibは、データをもとに2次元のプロット(グラフ)を作成するためのライブラリです。オブジェクト指向のAPIを備えており、作成したグラフをPythonアプリケーションに組み込むことも簡単に行えます。IPythonシェル、Jupyter Noteboo

  2. Matplotlibを使ってPythonで正弦波(サイン波)のグラフを描く方法

    Matplotlibは、Pythonで最も広く使われているデータ可視化ライブラリの一つです。データを可視化することは、数値を一つひとつ確認したり複雑な計算を行ったりしなくても、データ全体の傾向や特徴を直感的に把握できるようになるため、データ分析において非常に重要なステップとなります。また、定量的な洞察を視覚的に伝えることで、聴衆への説明も格段に分かりやすくなります。 Matplotlibは主に2次元のプロット(グラフ)を作成するために使用されます。オブジェクト指向のAPIを備えており、作成したグラフをPythonアプリケーション内に簡単に組み込むことができます。IPythonシェル、Jupyt