検索
連載

[Python入門]イテレータとはPython入門(2/2 ページ)

Pythonにおける複数データの反復処理を支える基盤である反復可能オブジェクトとイテレータの振る舞いを見た後、自分でイテレータを定義してみよう。

PC用表示 関連情報
Share
Tweet
LINE
Hatena
前のページへ |       

カウントアップするイテレータを定義する

 ここでは単純にカウントアップ(0から指定された範囲の整数値を順に返送)するイテレータを定義してみよう。これはスタート値やステップ値の指定がない、簡易的なrangeクラスのようなものと考えられる。インスタンス生成時に上限を指定すると(デフォルトは5とする)、上限に指定された回数だけ整数値を列挙した後はStopIteration例外を発生するようにしよう。

 ここで定義するクラスはおおよそ次のようなものになる。

class CountUpIterator:
    def __init__(self, limit=5):
        # 上限とカウンターの初期化処理
        pass
    def __iter__(self):
        # 自身を呼び出し側に戻す
        pass
    def __next__(self):
        # 上限を超えるまではカウントアップして、その値を戻す
        pass

カウントアップするイテレータの概形

 このクラスのインスタンスが管理するのは、上限値と現在値だ。上限値はインスタンス生成時に__init__メソッドのパラメーターlimitに渡されるようにする(デフォルト引数値を「5」に指定)。現在値とはnext関数または__next__メソッドを呼び出した側に返送する値のことだ。上限値はインスタンス変数のself.limitで、現在値は同じくインスタンス変数のself.counterで管理するようにしよう。この上限値と現在値を__init__メソッドで初期設定すればよい。

 また、__iter__メソッドは自分自身(self)を戻り値にするだけなので「return self」の1行で済むだろう。よって、これら2つのメソッドを定義すると次のようになる。

class CountUpIterator:
    def __init__(self, limit=5):
        self.limit = limit
        self.counter = -1
    def __iter__(self):
        print('__iter__ method called')
        return self
    def __next__(self):
        # 上限を超えるまではカウントアップして、その値を戻す
        pass

カウントアップするイテレータの__init__メソッドと__iter__メソッドを実装したところ

 __init__メソッドで「self.counter = -1」と初期値を「-1」にしているのは、__next__メソッドで値を返すときの処理を簡単にするためだ。また、__iter__メソッドには呼び出されたことを画面に表示するprint関数呼び出しも追加しておいた。

 __next__メソッドでやることは、self.counterの値を1つ増やすこと、self.counterの値とself.limitの値を比較して、上限に達していればStopIteration例外を発生させること、そうでなければself.counterの値を返送することだ。これをコードにすると次のようになる。

class CountUpIterator:
    def __init__(self, limit=5):
        self.limit = limit
        self.counter = -1
    def __iter__(self):
        print('__iter__ method called')
        return self
    def __next__(self):
        print('__next__ method called')
        self.counter += 1
        if self.counter >= self.limit:
            raise StopIteration()
        return self.counter

カウントアップするイテレータ(完成)

 __init__メソッドでself.counterの値を-1にしておいたので、その値を1つ増やすだけで、最初に返送する「0」という値にできる。__init__メソッドでself.counterの値を0にした場合にどんなコードを書けばよいかは自分で考えてみよう。

 では、このコードでCountUpIteratorクラスを定義したら、その振る舞いを確認していこう。

Copyright© Digital Advantage Corp. All Rights Reserved.

前のページへ |       
[an error occurred while processing this directive]
ページトップに戻る