《27》検索:メソッド index〈Python 3.0 版〉
実録:はじめてのプログラミング《記事一覧》
《27》検索:メソッド index
関連記事
検索:メソッド index
組み込み型 list と同様に、メソッド index を利用して各要素のオフセット値が得られると便利です。すると、
def ex_index(): X = 's = myList("ABC"); s' print(">>>",X) eval(compile(X,"","single")) for e in "ABC@": X = "s.index({0!r})".format(e) print(">>>",X) print(eval(X)) >>> ex_index() >>> s = myList("ABC"); s ['A', 'B', 'C'] >>> s.index('A') 0 >>> s.index('B') 1 >>> s.index('C') 2 >>> s.index('@') Traceback (most recent call last): ... raise ValueError("{0}.index(x): x not in {0}".format(s)) ValueError: myList.index(x): x not in myList
先頭の要素 'A' のオフセット値は 0 になるのが分かります。また、存在しない要素 '@' を指定すると、例外 ValueError を生成して、エラーメッセージが出力されます。
実現:メソッド index
メソッド list.index に準拠したものを実現します。
class myList(object): ... def index(self, value): for n,e in enumerate(self): if e==value: return n else: s = self.__class__.__name__ raise ValueError("{0}.index(x): x not in {0}".format(s))
組み込み関数 enumerate を利用すると、各要素の添字(先頭からのオフセット値)n が得られるので、指定した引数 value と同じ値の要素 e が得られたときに、添字 n をリターン値にします。条件を満たす要素が見つからないときには、例外 ValueError を生成するとともに、プログラマーへの注意を促すエラーメッセージを出力します。
《Note》 組み込み関数 enumerate と組み合わせて利用するときも、より簡潔に表現できるのが分かります。ただ self と記述するだけで、各要素 e を参照する手段には依存しない(情報隠蔽の原則に沿って)抽象的な表現ができるのも〈GoF〉Iterator パターンの効用のひとつです。■
Tips
ここでは、for ブロックに続く処理がないので、エラー処理を else ブロックに記述する必要はありません。ここでは、複雑な後処理が必要になったときに備えて、あらかじめ else ブロックを用意しています。ただし、仕様変更に対するこの先行投資は無駄になるかもしれません。《うさぎ》□