[Python入門]イテレータとは:Python入門(2/2 ページ)
Pythonにおける複数データの反復処理を支える基盤である反復可能オブジェクトとイテレータの振る舞いを見た後、自分でイテレータを定義してみよう。
カウントアップするイテレータを定義する
ここでは単純にカウントアップ(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__メソッドで「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.