Java.use(better, Python)《10》for と別れる50の方法(その参)

記事一覧《こちらに移動中です》2006年6月16日 (金)

Java.use(better, Python)  # Stairway to Real Agile World

《10》for と別れる50の方法(その参)《Jython2.5.0》

《著》後藤いるか・河野かえる・伊藤うさぎ・小粒ちゃん+∞《監修》小泉ひよ子とタマゴ倶楽部
第1版♪2003/05/23

■ 概要

__getitem__ を多重定義すると、組み込み型と同様に、任意のインスタンスにも添字付けや for 文を適用できるようになります。

for 文が提供するフレームワークを任意のオブジェクトに適用可能とするには、いくつかの方法があります。

《10》for と別れる50の方法(その参)

イテレーターに代るもの

組み込み型のリストや辞書だけでなく、任意のインスタンスに対して、添字付けや for 文が使えると便利です。

my = MyDict(xdict)
assert `type(my)` == ""

任意の辞書 xdict を保持する MyDict のインスタンスを生成して、変数 my に代入します。

for each in my:
  print "@"+`each`,
print
# -------------------------------- Output --
@('B', 'blue') @('R', 'red') @('G', 'green')

for 文を使うと、制御変数 each に、my が保持する辞書内の要素が順に代入されます。出力結果を見ると、"@" の後に各要素(タプル)が続き、空白で区切られているのが分ります。

※ 制御変数 each には、キー要素だけでなく、値要素が代入されます。また、添字には、整数を指定できます。items() などを使う場合と比べて、より簡潔で統一された表現ができます。□

for key,value in my:
  print "@"+key+"="+value,
print
# -------------------------------- Output --
@B=blue @R=red @G=green

for 文を使うと、制御変数 key,value に、my が保持する辞書内の要素が順に代入されます。出力結果を見ると、"@" の後に各キー要素と値要素が続き、空白で区切られているのが分ります。

print my[0]
# -------------------------------- Output --
('B', 'blue')

添字に整数 0 を指定すると、my が保持する辞書内の要素 ('B','blue') が得られます。

class MyDict:
  def __init__(self,dict):
    self.dict = dict
    self.keys = self.dict.keys()
  def __getitem__(self,index):
    key = self.keys[index]
    value = self.dict[key]
    return key,value

メソッド関数 __getitem__ を再定義します。引数 index には、各要素を参照するための添字が渡されます。ここでは、インスタンス属性 self.dict には、辞書が代入されています。また、インスタンス属性 self.keys には、辞書のキー要素からなるリストが代入されています。そこで、添字 index によって参照される辞書内のキー要素 key と、それに対応する値要素 value を持つタプルを、リターンオブジェクトとします。

組み込み型のリストや辞書と同様に、任意のクラス型のインスタンスに対しても、添字付けや for 文を利用できます。これによって、簡潔で統一されたコードを記述できるようになりました。ここで定義したクラスは、ラッパーと見なすことができます。

《Note》演算:items
a.items()

辞書 a に含まれる対(値とキー)を要素とするリストを得ます。□

for each in xdict.items():
  print "@"+`each`,
print
# -------------------------------- Output --
@('B', 'blue') @('R', 'red') @('G', 'green')

for 文を使って、各要素対(キーと値)を参照するには、メソッド関数 items を使うと便利です。制御変数 each には、タプル(キーと値)が順に代入されます。出力結果を見ると、"@" の後にタプル(キーと値)が続き、空白で区切られているのが分ります。

《Note》演算:keys
a.keys()

辞書 a に含まれるキーを要素とするリストを得ます。□

for each in xdict.values():
  print "@"+each,
print
# -------------------------------- Output --
@blue @red @green

for 文を使って、各値要素だけを参照するには、メソッド関数 values を使うと便利です。制御変数 each には、値要素が順に代入されます。出力結果を見ると、"@" の後に値要素が続き、空白で区切られているのが分ります。

《Note》演算:values
a.values()

辞書 a に含まれる値を要素とするリストを得ます。□

==================================
後藤いるか+河野かえる 著 ◆ 監修:小泉ひよ子とタマゴ倶楽部

Last updated♪2009/08/02