《44》デザインパターン〈GoF〉Iterator〈Python 2.x 版〉

実録:はじめてのプログラミング記事一覧
《44》デザインパターンGoFIterator

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

今日の進捗

  • The Python Standard Library: Mapping Types — dict
  • Python.use(better) -- セミナー研修テキスト
  • 連想リスト課題を「続・ひよ子のきもち」で公開
Comment
本人:野中 お言葉に甘えて課題を済ませてから間違って編集した部分の再編集に取り組みます。
担当:伊藤/本間 。(^^)

デザインパターンGoFIterator

組み込み型 dict と同様に、イテレーターを利用して各要素を参照できると便利です。すると、

def ex():
    m = myDict((e,ord(e)) for e in "ABC")
    print m,"\t#",m.__class__.__name__
    for e in m: print e,
    print "\t# __iter__"
    for e in m.keys(): print e,
    print "\t# keys"
    for e in m.values(): print e,
    print "\t# values"
    for e in m.items(): print e,
    print "\t# items"

>>> ex()
{'A': 65, 'B': 66, 'C': 67} 	# myDict
A B C 	# __iter__
A B C 	# keys
65 66 67 	# values
('A', 65) ('B', 66) ('C', 67) 	# items

for 文とともに利用すると、各キー要素(文字列)を順に参照できます。つまり、メソッド keys を利用するのと同じです。メソッド values を利用すると、各値要素(ASCII コード値)を順に参照できます。メソッド items を利用すると、各要素対(タプル)を順に参照できます。

class myDict(object):
    ...
    def __iter__(self):
        for e in self.keys():
            yield e
    def keys(self):
        return self._keys
    def values(self):
        return self._values
    def items(self):
        s = []
        for k,v in zip(self._keys, self._values):
            s.append((k,v))
        return s

メソッド __iter__ は、基本構文 for..in などに呼応して、各要素を参照する手段を提供します。yield 文を利用すると、要素(処理済/未処理)の取扱いが容易になります。
メソッド keys/values を実現するときには、属性 self._keys/self._values をリターン値にするだけです。メソッド items では、組み込み関数 zip を使って同じオフセット位置にある各要素対を順に参照しながら、要素対のタプル (k,v) を生成して追加します。

Tips

Last updated♪09/03/16