Python.use(better) #OOP:集合〔set〕
‖記事一覧‖ Python.use(better)《Python3.1》《復刻版》
OOP:集合〔set〕
《著》真樹育未、小粒ちゃん+∞《監修》小泉ひよ子とタマゴ倶楽部
第1版♪1988/05/23 ● 第2版♪2001/01/29 ● 第3版♪2009/12/15
オブジェクト指向プログラミング〔OOP〕の基本概念の理解を深めます。
※ Python1.5 で作成した例題を、Python3.1 で再構成しました。
コンテナー(コレクション)
任意のオブジェクトを保持するコンテナー(コレクション)として、
- シーケンス〔sequence〕
- マップ〔map〕
が挙げられます。
集合
組み込み型 set は「集合」の概念を実現したものです。集合は、重複しない要素を列挙したもので、その順序には意味がありません。
■ 事例1:
>>> s = set("ABC"); s; id(s) {'A', 'C', 'B'} 6710856 >>> s = set("ABC"); s; id(s) {'A', 'C', 'B'} 6711336 >>> for e in s: e,id(e) ('A', 1014432) ('C', 1014496) ('B', 1014464)
変数 s の束縛を解いて、ある集合オブジェクト {'A', 'C', 'B'}(id:6710856)を解放すると、再束縛によって別の(同値な)集合オブジェクト {'A', 'C', 'B'}(id:6711336)を参照します。解放されたオブジェクトは回収されて、他のオブジェクトを生成するために再利用されます。
この概念モデルを見ると、あたかも「名前のない属性変数を介して、他の文字列を参照している」かのようです。そのため、リストと違って、各要素を参照するのに添字を利用できません。
■ 事例2:和集合
>>> s1 = set("AB") >>> s2 = set("BC") >>> s1; id(s1); s2; id(s2) {'A', 'B'} 6445216 {'C', 'B'} 6711216 >>> for e in s1: e,id(e) ('A', 1014432) ('B', 1014464) >>> for e in s2: e,id(e) ('C', 1014496) ('B', 1014464) >>> ss = s1|s2; ss; id(ss) {'A', 'C', 'B'} 6711336 >>> for e in ss: e,id(e) ('A', 1014432) ('C', 1014496) ('B', 1014464)
演算子 | によって得られた和集合オブジェクト {'A', 'C', 'B'}(id:6711336)は、各要素(長さが1の文字列)を保持するコンテナーと見なせます。
>>> id(set) 3321696 >>> id(set.__or__) 127224 >>> type(set.__or__)
■ 事例3:和集合
>>> a,b = "A","B" >>> for e in a,b: e, id(e) ('A', 19738592) ('B', 19738528) >>> s1 = set(a); s1; id(s1) {'A'} 6711816 >>> s2 = set(b); s2; id(s2) {'B'} 6711696 >>> ss = s1|s2; ss; id(ss) {'A', 'B'} 6710856 >>> for e in ss: e,id(e) ('A', 1014432) ('B', 1014464)
演算子 | を利用するたびに、新たに生成した集合オブジェクト ss: {'A', 'B'}(id:6710856)が生成されます。ここで、着目して欲しいのは、
- 演算子 | によって生成した集合が、要素として保持する文字列 "A","B" と、
- 連結するために用意した、変数 a,b によって束縛される文字列 "A","B" とは、
別のオブジェクトになることです。
》こちらに移動中です《
↑TOP