## 第4章 組み込み型とオブジェクト --- ### オブジェクト指向 --- ### インスタンスの管理とID Python はオブジェクト指向言語 1つ1つのオブジェクトにIDを割り当てて管理 ![137](images/137.png) ---- ### 代入の正確なイメージ ![138](images/138.png) 「3という値を表すオブジェクトがコンピュータのメモリ上のどこかに保管される。 その保管場所を示す所在地情報が、aという名前の箱に入れられる」 --- ### 代入の正確なイメージ ``` a = 2 b = b ``` ![139](images/139.png) ---- ### インスタンスの同値性と同一性 「同値」と「同一」は異なる概念 ![140](images/140.png) ---- ### クラスとインスタンスとメソッド * インスタンス - オブジェクトのこと * クラス - インスタンスの種類(型)のこと * メソッド - クラスごとに定義された機能 (関数のようなもの) ``` 例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 演算子 ![147](images/147.png) 文字列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クラスのインスタンス ![149](images/149.png) --- ### メソッドを使ったリストの操作 ``` 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文を用いてリストの要素を作成することができる ![152](images/152.png) 例 ``` 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 構文を含む内包表記 ![153](images/153.png) 例 ``` 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 エラー ``` タプルは要素の値を変更できない --- ### ( )の省略とアンパック代入 タプルの作成時に ( )を省略できる ![156](images/156.png) --- ### 辞書と集合(セット) --- ### 辞書 * キーと値のペアを格納 * インデックスの代わりにキーを使って値を取得できる ![158-1](images/158-1.png) ``` info = {'firstname':'太郎', 'lastname':'山田', 'address': '茨城県つくば市 99-99'} info['firstname'] 太郎 ``` ![158-2](images/158-2.png) --- ### 辞書の要素の取得 keysメソッドによるすべてのキーの取得 ![159-1](images/159-1.png) valuesメソッドによるすべての値の取得 ![159-2](images/159-2.png) itemsメソッドによるすべての要素(キーと値のペアを格納したタプル)の取得 ![159-3](images/159-3.png) ---- ### 辞書の操作 ``` 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} ![162](images/162.png) ``` 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 ``` --- ### セットどうしの演算(集合演算) ![164](images/164.png) ``` 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'} ``` ---- ### 基本型の性質 * 変更可能(ミュータブル) * 反復可能(イテラブル) * 順序を持つ(シーケンス) --- ### 基本型の性質 ![167](images/167.png) --- ### ミュータブルな型とイミュータブルな型 * ミュータブルな型:値を変更できる list型、dict型、set型(リスト、辞書、セット) * イミュータブルな型:値を変更できない int型、float型、bool型、str型、tuple型 (数値、真偽値、文字列、タプル) ※ インスタンス(オブジェクト)そのものを取り換えないと値を変えられない --- ### ミュータブルな型とイミュータブルな型 変数aの値を変える
変数aが参照するオブジェクトが別のものに替わる ``` a = 2 id(a) 140735461447360 a = 3 id(a) 140735461447392 ``` 変数aの要素の値を変える
変数aが参照するオブジェクトは変わらない ``` a = [1, 2, 3] id(a) 2103730545344 a[0] = 3 id(a) 2103730545344 ``` ---- ### 反復可能なオブジェクト 反復可能なオブジェクト(イテラブルなオブジェクト) ``` for a in xxxxxxx: print(a) ``` ※ for 構文で1つ1つの要素を参照できる 文字列、セット、タプル、リスト、辞書 (str型、tuple型、list型、dict型、set型) ``` for a in 'Python': ... print(a) P y t h o n ``` ``` for a in {1, 2, 3}: ... print(a) 1 2 3 ``` --- ### 順序を持つオブジェクト a[0], a[1]のようにインデックスで要素を参照できる (シーケンス型のオブジェクト) 文字列、リスト、タプル (str型、list型、 tuple型) ``` a = 'Python' a[2] 't' ``` ``` a = (1, 2, 3) a[2] 3 ``` ---- ### スライス式 スライス式でインデックスの範囲を指定できる [start:end] ← start ~ (end-1)の範囲 ``` a = 'Python' a[1:3] 'yt' ``` ``` a = (0, 1, 2, 3, 4) a[2:5] (2, 3, 4) ``` [start:end] start または end を省略できる。 省略した場合は、それぞれ0と(要素数)を指定したものとみなされる。 ``` a = 'Python' a[:3] 'Pyt' ``` ``` a = (0, 1, 2, 3, 4) a[2:] (2, 3, 4) ``` --- ### 基本型の性質 ![173](images/173.png) --- ### 練習問題 --- ### 問題 1 次の文章の空欄に入れるべき語句を答えてください。 ``` ・ Pythonは [ (1) ] 指向型の言語であり、クラスは[ (1) ]の属性や機能を定義したものです。 ・ 'Hello'や'Python'といった文字列はstr型のオブジェクトですが、別の表現をすると、strクラスの [ (2) ] である、ということができます。 ・ strクラスには、文字列に含まれる文字を小文字に変換するlowerという[ (3) ]があります。 ・ a == bという式の値がTrueであったとき、aとbは [ (4) ] であるといい、a is bという式の値がTrueであったとき、aとbは [ (5) ] であるといいます。 ``` --- ### 問題 1(解答) 次の文章の空欄に入れるべき語句を答えてください。 ``` ・ Pythonは [ オブジェクト ] 指向型の言語であり、クラスは[オブジェクト ]の属性や機能を定義したものです。 ・ 'Hello'や'Python'といった文字列はstr型のオブジェクトですが、別の表現をすると、strクラスの [ インスタンス ] である、ということができます。 ・ strクラスには、文字列に含まれる文字を小文字に変換するlowerという[メソッド]があります。 ・ a == bという式の値がTrueであったとき、aとbは [ 同値 ] であるといい、a is bという式の値がTrueであったとき、aとbは [ 同一 ] であるといいます。 ``` --- ### 問題 2 n 番目の要素の値がn * nであるようなリストを、内包表記を使って作成してください。ただし、要素数は10とします。 --- ### 問題 2(解答) n 番目の要素の値がn * nであるようなリストを、内包表記を使って作成してください。ただし、要素数は10とします。 ``` [n * n for n in range(1, 11)] ``` --- ### 問題 3 次の説明文が、リスト、タプル、辞書、セットのいずれに該当するか、答えてください(複数が該当する場合もあります)。 ``` (1) キーと値のペアを格納する (2) 要素の値の重複が許されない (3) 要素の値を変更できない (4) インデックスで要素にアクセスできる ``` --- ### 問題 3(解答) 次の説明文が、リスト、タプル、辞書、セットのいずれに該当するか、答えてください(複数が該当する場合もあります)。 ``` (1) キーと値のペアを格納する 辞書 (2) 要素の値の重複が許されない セット (3) 要素の値を変更できない タプル (4) インデックスで要素にアクセスできる リストとタプル ``` --- ### 問題 4 下記の表は、基本型が、どのような性質を持つかをまとめたものです。空欄に対して、○か×を入れてください。 ![181](images/181.png) --- ### 問題 4(解答) 下記の表は、基本型が、どのような性質を持つかをまとめたものです。空欄に対して、○か×を入れてください。 ![182](images/182.png)