データ型
データ型1
homepage
# データ型 Pythonのプログラムが働くうちに、変数の値はメモリーに保存されています。違いタイプの変数に対しては違いデータ型で保存しなければなりません。私たちはこの節で変数とデータ型の知識を習います。 ##変数 Pythonの変数はメモリー中のデータとそのメモリアドレスを関連するものです。我々がある変数に値を与える際、その値をメモリに保存します。 この変数を使う時、実は相応のメモリアドレスに保存される値を指定しています。例えば、我々は以下のソースで変数aに値を与えることができます。 ``` a = 100 ``` この操作の意味は、メモリのある位置で整数“100”を保存して、変数aがこの値のメモリアドレスを指しています。つまり我々が変数に再び値を与える時の実質は、新しい初期化によって、変数がほかのメモリアドレスに指しています、もともとの位置で数値を変えることではありません。以下の例はこのことのソース表示です: ``` a = 100 b = a a = a + 1 ``` もしこの時aとbを個別に使ってみるなら、すぐ気づいたのは、aは101になりましたが、bは100のままです。b=aの操作を行った際、bも100の位置を指していました。 それに対して、aに101という値を与えた時、元の位置の100を変えるわけではなくて、メモリで101を保存している新しい位置を指しています。 メモリを節約するため、よくdel()メソッドを使い、変数をけ削除してメモリを解放します。 ##number まず紹介するのは数字のデータ型です。Pythonでは数字を三つ分けられます。一番目はint型、整数です。二番目はfloat型、浮動小数点数で、つまり小数点のある数字のことです。三番目は日常の開発で使われるチャンスがあまりなく複数です。 ###int Intというのは英語の単語integerの略称です。Pythonでのint型は正負の差別があります、普段と同じく、そのまま数字を書くと正数と見られます、数字の前に"-"をつけると負数になります。 intは通常に十進数による表示されますが、ほかの進数でも使われます。例えばパソコンでよく使うに進数と十六進数は、別々数字の前に“0b”と“0x”をつける形式で表示します。 次は例です: ``` a = 256 a = 0b10000000 a = 0x100 ``` aに三回値を与えましたが、実は同じ数です。 値を与える際で数字の進法を指定することもできます、例えば次のソースは七進数で値を与えることを表示しています。 ``` a = int('11463', 7) ``` 注意しないといけませんのは、ほかのプログラミング言語で、整数はlong型(倍長整数型)もしくはshort(短整数型)というデータ型もあります。昔でこう言うデータ型が存在するPythonバージョンもありましたが、今最新バージョンのPythonではlong型とshort型は存在しません、整数のデータ型はint型しかありません。 ### float floatいわゆる浮動小数点数、もしくは小数点のある数字ということです。floatも正負の差別があります。そして、結果が整数で表示できない割り算などの操作をする時、Pythonは変数を自動的にfloatに変換します。 例えば次のソース: ``` a = 10 print(type(a)) a = a / 3 print(type(a)) ``` 二回のアウトプットの結果は違っています、一回目はint型で、二回目はfloat型です。 変数はint型の可能性もあり、float型の可能性もありますが、変数を比較する時、特にイコールかどうかを判断する時に、変数のデータ型にかかわらず同じ答えが出ます。 例えば次のソース: ``` a = 10 b = 10.0 print(a==b) ``` このソースを実行すると、"True"の結果がでます。 先の整数と似たように、ほかのプログラミング言語ではdouble(倍精度浮動小数点数)というデータ型が存在します。floatは一般的に32bitの浮動小数点数で、doubleは64bitの浮動小数点数を表示します。 しかし、最新バージョンのPythonでは、floatはすでに64bitなので、doubleというデータ型は存在しません。 ##boolean boolean言わばプールです。プールの値は二つしかありません、それはTrueとFalseです。なので、よく真と偽を示します。判断を行う時、その結果はよくプールで表示します(ミスが出ない場合)。条件分岐或いはwhileループの条件式で使われます。 下は例です: ``` a = 1 while a < 100: print(a) a += a ``` "a < 100"はループ進めるの条件式で、この判断の結果はTrueになる場合はループが続きます、逆にFalseになる場合はループが中止します。 今のうちにこのソースコードが分からなくても構いません、その後の勉強でまた条件式とループについて詳しく説明します。 ##string stringというのは文字列のことです。文字通り文字を保存するたびに使われます。私たちが“Hello, World”でプリントしたのは文字列です。 stringがPythonでの表示は**シングル引用符**により囲まれる文字です、例は以下のようです。 ``` a = '月は綺麗ですね' print(a) ``` 文字列は引き算、掛け算、割り算などの数学的な計算ができませんが、文字列と文字列はお互いに"加え算"ができます。そのルールとしては、内容を追加したい文字例の後ろに直接に内容を追加します。 例: ``` a = 'このことについて論じる必要はありません,' b = '私に従いなさい' print(a+b) ``` この場合、プリントした結果は'このことについて論じる必要はありません,私に従いなさい'になります。 その一方、注意しないといけないのは、文字列の中の数字はすでに「文字」の形式になりましたので、intあるいはfloat型の数字との比較、もしくは計算することができません。 次の例のように、実行するとエラーになります。 ``` a = 1 b = '1' c = a + b d = (a < b) ``` もちろん、文字例そのものは決して「比較することができない」ではありません。例えば次の例は実行できます。 ``` print('B' > 'A') print('我' > '你') ``` 先のソースコードを実行すると、二つの“True”がでます。では何故でしょうか?とにかくしたのしたのソースコードを実行してみます。 ``` print(ord('A')) print(ord('B')) print(ord('我')) print(ord('你')) ``` この時出た結果はそれぞれ“65”“66”“25105”“20320”になります。これはPythonで文字例はその相応のエンコードがあるからです。比較の時実際に比較するのはそれぞれのエンコードです。 エンコードは計算することもできますので、たくさんの応用場面では役に立てます(例えば大文字小文字の転換)。 ###書式作成(フォーマット) 実際にプログラミングする時、よく書式付き入出力の必要があります。例えば照会システムで「xxx様、お選びいただいたxxxコースについて、今月の費用はxxxxxx円になります。」のようなメッセージを出力したいのですが、メッセージの中で客の名前、コースの種類、費用は全部データベースから検索して取り出したものになります。こういう場合のソースは以下のようになります。 ``` a = 'パイソン太郎' b = '快速入門' c = 100000 print('%s様、お選びいただいた%sコースについて、今月の費用は%d円になります。'%(a,b,c)) ``` このソースを実行すると、もらいました結果は「パイソン太郎様、お選びいただいた快速入門コースについて、今月の費用は100000円になります。」になります。 このような形で文字例をフォーマットすることもできるようになりました。文字例の中に**スタブ**を追加して、%の後ろに順に相応の変数をあげます。 |スタブ|データ型| |:---:|:---:| |%s|string| |%d|int| |%f|float| 現行バージョンのPythonでは、どのスタブを使うべきかが分からなくても、一律に%sで代替して、全ての内容を文字例としてプリントできます。 上のソースの全てのスタブを%sに代わっても、同じ結果がでます。 しかし、%dと%fは少し特別で、もっと多めのスタイルが選択できます。以下のソースを実行してみてください。 ``` a = 123.456 print('プリントしたい内容は%04d'%a) print('プリントしたい内容は%.2f'%a) ``` フォーマットの方法は先言いました方法だけではなく、format methodを利用してもできますが、先の方法は一番便利でよく使われいます。 今後ほかの方法に会いましたら、改めて紹介します。 ## tuple、listとset tuple、listとsetというのはPythonでよく使われている集合のデータ型です、中身は複数のエレメントが存在できます(もちろん、一つのエレメントだけでも、何もなくても構いません)。この三つの違いは以下のようです。 |データ型|シンボル|特徴| |:---:|:---:|:---:| |tuple|() 括弧|エレメント重複可能,変更不可| |list|[] ブラケット|エレメント重複可能,変更可能| |set|{} ブレース|エレメント重複不可,変更可能,自動的ソート| 上のテーブルによって、tuple、listとsetの相違点はもうわかっています。これからこの三つの集合に値を与える方法を紹介します。値を与えるのは二つの方法がありますが、 結果としては同じです。では、それぞれに(1,3,5,7)を与えます。 ``` t = (1, 3, 5, 7) l = [1, 3, 5, 7] s = {1, 3, 5, 7} ``` 上のソースと下のソースは全く同じ機能です。 ``` t = tuple((1, 3, 5, 7)) l = list((1, 3, 5, 7)) s = set((1, 3, 5, 7)) ``` この方法を使う時注意すべきのは括弧は二重になります。 ### tuple、listとsetの操作 Pythonでのtuple、listとsetは操作できます。例えばエレメントの呼び出し、エレメントの増減など ####呼び出しと切り出し tupleやlistに値を与える時、中身のエレメントの順番はそのまま代入の順にしますので、指定したいエレメントが呼び出しできます。 一つのエレメンのだけを呼び出したいケースはとても簡単で、以下のソースになります。 ``` l = [1, 3, 5, 7] a = l[2] print(a) ``` このソースで、aにlist lのインデックスが2のエレメントを値として与えて、そしてプリントします。ここで注意しなければなりませんのは、**インデックスが0からはじまります、つまり、一番目のエレメントのインデックスは0です**。 初心者はよく忘れてしまうので、コーティングするとき、ミスが出ても気づきません。同じ通り、後ろからエレメントを指定することもできます、例えばlにある最後のエレメントはl[-1] として表示します。 連続の複数のエレメントを呼び出したい時は、切り出しの操作を行います。下のソースを見てください。 ``` l = [0, 1, 2, 3, 4, 5, 6, 7, 8] a = l[2:5] print(a) ``` 結果は[2, 3, 4]です。この時切り出し操作の境界を注意しなければなりません。下の境界値が含まれていますが、上の境界値が含まていません。 切り出し操作をする時、全てのエレメントをトラバーサルする必要もありません、ステップ幅を指定することもできます。 ``` l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] a = l[2:7:2] print(a) ``` 結果は[2, 4, 6]になります。ステップ幅も負数の指定ができます。例えば以下のようです: ``` l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] a = l[-3:-9:-2] print(a) ``` 複数のステップ幅の意味を体験しましょう。 切り出しをする時、もし下の境界値は最初から、上の境界値は最後までだとしたら、相応のインデックスが省略できます、例: ``` l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] a = l[:5] b = l[5:] print(a,b) ``` プリントした結果は[0, 1, 2, 3, 4]と[5, 6, 7, 8, 9, 10]になります。 インデックスによる呼び出しと切り出し操作はlistを対象とするだけでなく、tupleも対象として使えますが。setは切り出しができません、その理由はsetはエレメントを自動的にソートするからです。というのは、setの中にあるエレメントの順番はそのまま代入の順ではありません。したがって、setにあるエレメントをインデックスによる呼び出しはできません。インデックスによる呼び出しと切り出しは文字例にも操作できます、皆さん自分でやってみてください。 #### エディット それらのデータ型をエディットすることもできます、ではこれからエディットについて勉強しましょう。 #### インデックスによるエレメントに値を与える 下のソースはあるlistにインデックスを指定したエレメントに値を与えます: ``` l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] l[5] = 17 print(l) ``` このソースを実行すると、lは[0, 1, 2, 3, 4, 17, 6, 7, 8, 9, 10]になります。しかし、このような値を与える方法はtupleとsetには適用されていません。 それはsetのインデックスが指定できないとtupleは編輯できませんからです。ちなみに、stringもこの方法に適用されます。 ##### 集合内のエレメントの増減 集合内のエレメントを増加したり、削除したりすることもよくあります、listに対しては以下のようなメソッドが用意されています。 |Method|説明| |:---:|:---| |remove()|list内のある指定したエレメントを削除する| |pop()|listから一つのエレメントを取り出す(後ろから)| |append()|末尾にエレメントを追加する| |insert()|指定の位置にエレメントを追加します| pop()メソッドの使用を例として見ましょう、ほかのメソッドはみんな自分でやってみてください ``` l = [1, 2, 3, 4, 5, 6, 7, 8] a = l.pop() print(a, l) ``` setに対しては、それらのメソッドの効果は以下のようになります: |Method|説明| |:---:|:---| |remove()|set内のある指定したエレメントを削除する| |pop()|从set内から一つのエレメントを取り出す **(頭から)**| |append()|setの自動ソートにより、末尾は指定できませんが、add()メソッドは使えます| |insert()|setの中のインデックスは指定できませんので、setには使えません| #### 集合のエレメントの多様性 この節で、種類別に集合を紹介した時、理解しやすいため、基本的にintのエレメントを使っていました。事実上の集合には、様々なデータ型がエレメントとして使えます。 例えば、tupleに以下のように値を与えます: ``` t = (1, 1.0, '1', [1], True) ``` intでも、booleanでも、tupleに受け入れることを気づいたでしょう。リストさえできます。しかし、setはリストを受け入れません、このことについて注意してください。 次のソースを実行すると、面白いことが起きます、「何故こうなるか」を考えてください。 ``` s = {1, 1.0, '1', True} print(s) ``` #### エディットと改めて値を与える ここで強調したいのは変数のエディットと改めて値を与える差別です。ある変数に改めて値を与える時、メモリに新しいストックを作り、新しい値をそのストックに保存します、変数もその新しいメモリストックを指向します。それに対して、変数をエディットする時は、元のメモリストックの値を編輯するため。変数はそのまま元のメモリストックを指向します。 以下のソースで体験しましょう。 ``` l = [1, 2, 3, 4, 5, 6] n = [1, 2, 3, 4, 5, 6] ll = l nn = n l[2] = 100 n = [1, 2, 100, 4, 5, 6] print('llの値は%s' % ll) print('nnの値は%s' % nn) ``` このソースを実行して、lをエディットして、llはもともとlと同じメモリストックを指向していましたが、このメモリストックの値を編輯したから、llの内容も変わりました。一方、nに対しては、改めて値を与えますので、新しい値が新しいメモリストックに保存されます。nも新しいメモリストックを指向するようになりましたが、nnはまだもともとのメモリストックを指向しています。なので、nnの内容は変わっていません。 #### tupleの編集不可性 前に言った通り、tupleは編輯不可です。しかし、tuple内のエレメントに対してはどうですか?次のソースを実行して、tuple内のエレメントは編輯できるかどうかと改めて値を与えるかどうかを確認します。 ``` l1 = [1, 3, 5, 7] l2 = [2, 4, 6, 8] t = (l1, l2) print(t) l1 = [2, 3, 3, 3] l2[3] = 100 print(t) ``` 結果としては、改めて値を与えられたl1はtupleの中の内容は変わっていません、しかし、エディットされたl2はtupleの中の内容が変わりました。つまり、確かにtupleは編輯不可で、tupleにあるエレメントを追加したり、削除したりすることはできませんが。エレメントをエディットすることは可能です、エディットをエディットするにより、tupleの内容を変わることができます。何故改めて値を与える方法は効きませんでしたか、エディットと改めて値を与える差別を思い出して、考えてください。 ##dict dictは比較的に特殊な集合のデータ型です。dictのエレメントは関連している二つの値で、key:valueのように表示されます。keyの内容は繰り返しできませんが、valueの内容は制限ありません。この特性により、dict実際の応用場面でよく使われています。例えば、あるクラスの生徒の各種のデータを使いたい時。生徒ごとに、名前、年齢、身長、点数、番号を記録したい。次の二人の生徒を例にします: |Name|Age|Height|ID|Score| |---|---|---|---|---| |Sam|15|178|209001|87| |Tom|14|169|209002|98| この時、以下のソースでSamのデータを記録します: ``` sam = dict(Name='Sam', Age=15, Height=178, ID='209001', Score=87) print(sam) ``` もしくは、このような形で、Tomのデータを記録します。 ``` tom = {'Name':'Tom', 'Age':14, 'Height':169, 'ID':'209001', 'Score':98} print(tom) ``` 而我们需要调用其中的某一项的时候,则可以像下面这样: あるカラムを使いたいときは次のようです: ``` print(tom['Name']) ``` ### dictの編輯 dict中のエレメントは編輯可能です、追加したり削除したりこともできます。例えば、Tomに体重のデータを追加したい場合は次のソースを使います。 ``` tom['Weight']=63 ``` 削除は次のようになります: ``` del tom['Weight'] ``` dictのすべてのエレメントを削除することもできます。使用したのは以下のソースになります。 ``` tom.clear() ```
content
戻る