《27》検索:メソッド index〈Python 2.x 版〉

実録:はじめてのプログラミング記事一覧
《27》検索:メソッド index

《著》小粒ちゃん+α《監修》小泉ひよ子とタマゴ倶楽部
2009年2月19日(木)

今日の進捗

  • Language Reference: Data model; Emulating container types
  • Python.use(better) -- セミナー研修テキスト
  • 連結リスト課題を「続・ひよ子のきもち」で公開
Comment
本人:野中 似てるようで似てないもの(リターン値の有無とかエラーの有無とか)がたくさんあって頭が混乱しています。
担当:伊藤/本間 。(^^)

検索:メソッド index

組み込み型 list と同様に、メソッド index を利用して各要素のオフセット値が得られると便利です。すると、

def ex():
    s = myList("ABC")
    print s,"\t#",s.__class__.__name__
    for e in "ABC@":
        print e,s.index(e)

>>> ex()
['A', 'B', 'C'] 	# myList
A 0
B 1
C 2
@

Traceback (most recent call last):
  ...
    raise ValueError,"%s.index(x): x not in %s"%(name,name)
ValueError: myList.index(x): x not in myList

先頭の要素 'A' のオフセット値は 0 になるのが分かります。また、存在しない要素 '@' を指定すると、例外 ValueError を生成して、エラーメッセージが出力されます。

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,"%s.index(x): x not in %s"%(s,s)

組み込み関数 enumerate を利用すると、各要素の添字(先頭からのオフセット値)n が得られるので、指定した引数 value と同じ値の要素 e が得られたときに、添字 n をリターン値にします。条件を満たす要素が見つからないときには、例外 ValueError を生成するとともに、プログラマーへの注意を促すエラーメッセージを出力します。

《Note》 組み込み関数 enumerate と組み合わせて利用するときも、より簡潔に表現できるのが分かります。ただ self と記述するだけで、各要素 e を参照する手段には依存しない(情報隠蔽の原則に沿って)抽象的な表現ができるのも〈GoFIterator パターンの効用のひとつです。■

Tips

ここでは、for ブロックに続く処理がないので、エラー処理を else ブロックに記述する必要はありません。ここでは、複雑な後処理が必要になったときに備えて、あらかじめ else ブロックを用意しています。ただし、仕様変更に対するこの先行投資は無駄になるかもしれません。《うさぎ》□

Last updated♪09/03/14