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》
■ 概要
__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 に含まれる値を要素とするリストを得ます。□
==================================
後藤いるか+河野かえる 著 ◆ 監修:小泉ひよ子とタマゴ倶楽部