## 第4章 組み込み型とオブジェクト --- ### オブジェクト指向 --- ### インスタンスの管理とID Python はオブジェクト指向言語 1つ1つのオブジェクトにIDを割り当てて管理  ---- ### 代入の正確なイメージ  「3という値を表すオブジェクトがコンピュータのメモリ上のどこかに保管される。 その保管場所を示す所在地情報が、aという名前の箱に入れられる」 --- ### 代入の正確なイメージ ``` a = 2 b = b ```  ---- ### インスタンスの同値性と同一性 「同値」と「同一」は異なる概念  ---- ### クラスとインスタンスとメソッド * インスタンス - オブジェクトのこと * クラス - インスタンスの種類(型)のこと * メソッド - クラスごとに定義された機能(関数のようなもの) ``` 例1: 'Hello' というオブジェクト(文字列)はstrクラスのインスタンスで、lower()やcount()などのメソッドを持つ 例2:[10,20,30]というオブジェクト(リスト)はlistクラスのインスタンスで、reverse()やpop()などのメソッドを持つ ``` --- ### 組み込み型 * Pythonに最初から準備されている型(クラス) * これまでに学習したもの - int型、float型、str型、list型 * これから学習するもの - タプル、辞書、セット ※ いずれも複数のオブジェクトを格納するために使用する --- ### メソッドの呼び出し プログラムコードでの表記 **オブジェクト.メソッド名()** 例)文字列の中のo文字の数を数える ``` 'Hello, Python'.count('o') 2 ``` * 'Hello, Python' <---- オブジェクト * count() <---- メソッド名 --- ### strクラスのメソッド strクラスには文字列を操作するメソッドが定義されている | | | |:--------------|:------------------------------------| | count(x) | xが文字列にいくつ含まれるかを返す | | lower() | すべての文字を小文字にした文字列を返す | | upper() | すべての文字を大文字にした文字列を返す | | split(x) | 文字列をxで分割した結果をリストで返す | | replace(x, y) | 文字列に含まれるxをyに置換した結果を返す | ``` 'Hello, Python'.count('o') 2 ``` ``` 'PYTHON'.lower() python ``` ``` 'python'.upper() PYTHON ``` ``` '2021-12-31'.split('-') ['2021', '12', '31'] ``` ``` 'Java言語'.replace('Java', 'Python') 'Python言語' ``` --- ### strクラスのformatメソッド 文字列に含まれる{} への変数の値の埋め込み ``` year = 2021 month = 4 day = 10 message = '今日は{}年{}月{}日です'.format(year, month, day) print(message) 今日は2021年4月10日です <---- 文字列の中の{}に数字が埋め込まれた ``` {}の中でのインデックスの指定 ``` year = 2021 month = 4 day = 10 message = '今日は{1}月{2}日です。 西暦{0}年です。'.format(year, month, day) print(message) 今日は4月10日です。 西暦2021年です。 ``` * {1}にformatの1番目のmonthが埋め込まれる * {2}にformatの2番目のdayが埋め込まれる * {0}にformatの0番目のyearが埋め込まれる ※ インデックスは0から始まる ---- ### strクラスのformatメソッド {}の中での書式を指定できる {インデックス番号:書式} のように記述する (インデックス番号は省略可) 書式の例 ``` : 書式指定子。フォーマット指定の開始。 コロンの後ろに書式指定子を記述して、特定の形式で表示させることができる .3f 小数点以下3桁まで出力 , 3桁ごとにカンマで区切る >5 5文字分の幅に右寄せする ``` ``` '1/3={:.3f}'.format(1/3) 1/3=0.333 ``` ``` '{:,}円'.format(1000000) 1,000,000円 ``` ``` '{:>5}'.format(123) 123 ``` ---- ### in 演算子  文字列1 が 文字列2 に含まれると True、そうでないなら False になる ``` 'cat' in 'catch' True ``` ``` 'Z' in 'ABCDE' False ``` ``` s1 = 'py' s2 = 'python' s1 in s2 True ``` --- ### リストとタプル --- ### listクラスの主なメソッド ``` a = [10, 20, 30, 40] ``` aはListクラスのインスタンス  --- ### メソッドを使ったリストの操作 ``` a = [10, 20, 30, 40] a.append(100) a [10, 20, 30, 40, 100] a.pop() 100 a [10, 20, 30, 40] a.reverse() a [40, 30, 20, 10] a.index(20) 2 ``` ### メソッド以外のリストの操作 ``` a = [10, 20, 30, 40] del a[1] a [10, 30, 40] a = a + [0, 1] a [10, 30, 40, 0, 1] 1 in a True 2 in a False len(a) 5 sorted(a) [0, 1, 10, 30, 40] sorted(a, reverse=True) [40, 30, 10, 1, 0] ``` --- ### 内包表記 for文を用いてリストの要素を作成することができる  例 ``` data = [2**n for n in range(1, 11)] data [2, 4, 8, 16, 32, 64, 128, 256, 512, 1024] ``` ``` [str(n)+'月' for n in range(1, 13)] ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'] ``` ---- ### if 構文を含む内包表記  例 ``` data0 = ['apple', 'orange', 'banana', 'avocado'] data1 = [s for s in data0 if s[0] == 'a'] print(data1) ['apple', 'avocado'] <---- aで始まる単語だけが格納される ``` --- ### リストを含むリスト ``` data = [[1, 2], [3, 4, 5]] data[0][0] <---- 先頭のリストの先頭の要素を参照 1 data[0][1] <---- 先頭のリストの2番目の要素を参照 2 data[1][0] <---- 2番目のリストの先頭の要素を参照 3 data[1][1] <---- 2番目のリストの2番目の要素を参照 4 data[1][2] <---- 2番目のリストの3番目の要素を参照 5 ``` --- ### タプル リスト同様に複数の要素を格納する (コレクションとよぶ) リスト ``` a = [1, 2, 3, 4] a [1, 2, 3, 4] a[0] 1 a[0] = 99 a [99, 2, 3, 4] ``` タプル ``` a = (1, 2, 3, 4) a (1, 2, 3, 4) a[0] 1 a[0] = 99 エラー ``` タプルは要素の値を変更できない --- ### ( )の省略とアンパック代入 タプルの作成時に ( )を省略できる  --- ### 辞書と集合(セット) --- ### 辞書 * キーと値のペアを格納 * インデックスの代わりにキーを使って値を取得できる  ``` info = {'firstname':'太郎', 'lastname':'山田', 'address': '茨城県つくば市 99-99'} info['firstname'] 太郎 ```  --- ### 辞書の要素の取得 keysメソッドによるすべてのキーの取得  valuesメソッドによるすべての値の取得  itemsメソッドによるすべての要素(キーと値のペアを格納したタプル)の取得  ---- ### 辞書の操作 ``` info = {'firstname':'太郎', 'lastname':'山田', 'address': '茨城県つくば市 99-99'} info.get('firstname') 太郎 info.get('tel') None info['tel'] = '090-000-0000' info.get('tel') '090-000-0000' del info['tel'] len(info) 3 'age' in info False 'firstname' in info True ``` ---- ### 辞書の要素の並べ替え sorted 関数を使うと、辞書の要素を昇順に取得できる(キーを基準) ``` data = {'b':5, 'c':2, 'a':8, 'd':7 } print(sorted(data.items())) [('a', 8), ('b', 5), ('c', 2), ('d', 7)] ``` sorted 関数に key=lambda x:x[1] を指定すると、値を基準とした昇順に取得できる ``` data = {'b':5, 'c':2, 'a':8, 'd':7 } print(sorted(data.items(), key=lambda x:x[1])) [('c', 2), ('b', 5), ('d', 7), ('a', 8)] ``` --- ### セット * 値を格納 * 要素の重複を許さない。順序が無い。 リストは [1, 2, 3] タプルは (1, 2, 3) セットは {1, 2, 3}  ``` a = {'A', 'B', 'C', 'D'} a {'A', 'B', 'C', 'D'} ``` ``` a = {'A', 'B', 'B', 'C', 'C', 'C'} a {'A', 'B', 'C'} ``` ---- ### セットの操作 ``` data = [1, 2, 3] a = set(data) a {1, 2, 3} set1 = {'A', 'B', 'C'} set2 = {'B', 'C'} set1.issubset(set2) False set2.issubset(set1) True ``` --- ### セットどうしの演算(集合演算)  ``` set1 = {'A', 'B', 'C'} set2 = {'A', 'B', 'D'} set1 | set2 {'D', 'B', 'C', 'A'} set1 & set2 {'A', 'B'} set1 - set2 {'C'} set1 ^ set2 {'C', 'D'} ``` ---- ### 基本型の性質 * 変更可能(ミュータブル) * 反復可能(イテラブル) * 順序を持つ(シーケンス) --- ### 基本型の性質  --- ### ミュータブルな型とイミュータブルな型 * ミュータブルな型:値を変更できる list型、dict型、set型(リスト、辞書、セット) * イミュータブルな型:値を変更できない int型、float型、bool型、str型、tuple型 (数値、真偽値、文字列、タプル) ※ インスタンス(オブジェクト)そのものを取り換えないと値を変えられない --- ### ミュータブルな型とイミュータブルな型 変数aの値を変える