ここでは、pythonプログラミングの基本である、型とキャストについて解説します。まずは、Google Colaboratoryの使い方 を参考に、プログラミングの環境に移動しましょう。ローカルに環境を構築している方は、そちらでもokです。
型とは
型とは、変数に付随している情報です。変数一つ一つに対し、
- 整数(int型): 1, 10, 300, 1453, -5, -20など、小数点以下がない数字
- 実数(float型): 3.14, 200.00, 1430.21, -20.32など、小数点以下がある数字
- 文字列(str型): 「こんにちは」、「りんご3つ」など、文字列
といった情報が付与されています(他にもありますが、今回は基礎編なのでこの3つのみとします)。型を調べるには、type関数を利用します。例えば、以下のコードを見てください。
a = 3
b = 3.14
c = "こんにちは"
type_a = type(a)
type_b = type(b)
type_c = type(c)
print(a, "の型は", type_a, "です")
print(b, "の型は", type_b, "です")
print(c, "の型は", type_c, "です")
1〜3行目は変数の定義、5〜7行目はtype関数により変数の型を調べている部分です。
- 変数aの型type_aは、int型
- 変数bの型type_bは、float型
- 変数cの型type_cは、str型
という表示がされていることがわかります。intは整数、floatは実数、strは文字列ですから、先ほどの説明と同じ結果となっています。
Pythonでは、型が異なるとき、エラーが出てしまう場合があります。これをまとめたものが以下となります。
- floatとfloatの四則演算: → 計算可能(計算後、float)
- intとintの四則演算: → 計算可能(計算結果が整数で表現可能ならint、異なるならばfloat)
- strとstrの足し算: → 文字列結合(計算後、str)
- floatとintの四則演算: → 計算可能(計算後、float)
- floatとstrの四則演算: → エラー
- intとstrの四則演算: → エラー
実際に、いくつか確認してみます。
a = 3
b = -4
c = 3.21
d = -5.3
e = "こんに"
f = "ちは"
res_ab = a + b
res_cd = c + d
res_ac = a + c
res_ef = e + f
print(res_ab, type(res_ab) )
print(res_cd, type(res_cd) )
print(res_ac, type(res_ac) )
print(res_ef, type(res_ef) )
出力を見ると、先ほど述べたことが確認できると思います。ポイントは、
- 同じ型同士であれば計算できる。
- floatとintは、計算結果が実数になるので、代入先の変数は、floatになる。
でしょうか。ちなみに、
res_af = a + f
を実行すると、
- TypeError: unsupported operand type(s) for +: ‘int’ and ‘str’
という表記が返ってくると思います。これは、整数と文字列は足せません、というエラーメッセージになります。先ほど記載した通り、str型はintあるいはfloat型と計算することができません。
キャスト
キャストとは、型を別の型に変化させる行為となります。この必要性を認識するために、以下のコードを見てください。
a = 100.24
b = "530.24"
c = a + b
- TypeError: unsupported operand type(s) for +: ‘float’ and ‘str’
というエラーメッセージが返ってきたと思います。floatとstrは計算できないというものです。この理由は、bがstrになっているためです。慣れるまで少しわかりにくいかもしれませんが、bに代入されている数字は、ダブルクォーテーションで囲われています。したがって、530.24という数字は、文字列として扱われていることになります。
このエラーを回避するためには、bをstrからfloat型に変えることが必要になります(bのダブルクォーテーションを外すことでもエラーが回避できますが、本題からずれますので、それはしません)。キャストは、以下のように記述します。
- int(a) → 変数aをint型(整数)に変換
- float(a) → 変数aをfloat型(実数)に変換
- str(a) → 変数aをstr型(文字列)に変換
今回は、bをfloat型に変換すればokです。実際にやってみましょう。
a = 100.24
b = "530.24"
new_b = float(b)
c = a + new_b
print(b, type(b) )
print(new_b, type(new_b) )
エラーが消えたと思います。3行目にあるnew_bに対し、float型にキャストされたbが代入されているためです。念のため下2行にbとnew_bの情報を表示してみました。これを見ると、bはstrで、new_bがfloatであることがわかります。ちなみに、計算式の中でキャストしてしまっても構いません。例えば、
a = 100.24
b = "530.24"
c = a + float(b)
といった書き方です。「cに対し、aとfloat型にキャストされたbを足した値を代入する」というコードですから、問題なく動きます。
余談になりますが、同じ型なら計算できるならば、aをstr型にしてはどうかと思うかもしれません。しかし、文字列同士の足し算は、文字列をつなげたものになるということを思い出せば、あまりよくない結果になることが理解できると思います。実際にやってみると、以下のようになります。
a = 100.24
b = "530.24"
c = str(a) + b
print(c)
確かにエラーは出なくなります。しかし、cの中には「100.24530.24」が代入されていることがわかります。strは、たとえその中身が数字であっても、文字列として扱われますので、注意が必要です。
float型を int型にしたキャストする場合の注意点
以下のコードを見てください。
a = 100.71
new_a = int(a)
print(a)
print(new_a)
2行目で、float型の変数aをint型の変数にキャストし、new_aに代入しています。ここで、print関数によりaとnew_aの中身を見てみると、aは100.71なのに、new_aは100になっていることがわかります。int型の変数は小数点以下を扱うことができるため、強制的に小数点以下が切り捨てられるのです。このことに注意しないと、おかしな計算になってしまう場合があります。
多くの場合、何か高度な解析を行いたいとき、割り算を使う場合があります。割り算は、たとえint型同士の計算でも、float型でなくては計算結果を扱うことができません(例えば、5/2=2.5)。このため、計算を多用することが多い場合、ほとんどの変数はfloat型になります。
str型をfloat型にキャストする場合の注意点
以下のコートは、strで定義された数字を、float型にキャストするコードです。
a="2.35"
float_a = float(a)
この挙動については先ほど説明したので、理解できると思います。しかし、これを実行すると、strはfloatにキャストできると思い込んでしまいます。しかしながら、そうではない場合もあります。これを確認するため、以下のコードを実行してください。
a = "2.35あ"
new_a = float(a)
すると、
- ValueError: could not convert string to float: ‘2.35あ’
というエラーメッセージが出てきます。これは文字通り、「”2.35あ” は strからfloatに変換できない」という意味です。このように、str型の変数に対し数字以外の要素が入っていた場合、float型にキャストすることができません。
足し算電卓を作ってみよう
ちょっと色を変えて、簡単なアプリケーションを作ってみます。機能は以下の通りです。
- ユーザーが2つの数字を入力する
- その足し算の結果を表示する
これを作るためには、input関数の挙動を理解する必要があります。input関数は、
- キーボードから入力された文字列を取得する
という機能があります。大事な部分は「文字列を」という部分です。str型になるわけです。これを確認してみましょう。
a = input()
print("入力文字: ", a)
print("入力文字の型: ", type(a))
実行すると、入力ボックスが出てきます。そこにカーソルを合わせ、適当に文字を入れてください。すると、プログラムが先に動きます。これは、まず、1行目でキーボードから入力された文字を変数aに代入しています。その中身を2行目、その型を3行目で表示しています。入力された文字と、それがstrであるという表示が返ってくると思います。
これは、たとえ数字のみが入力された場合でも、strとなります。したがって、入力された2つの数字を足し合わせるというアプリケーションを作ろうとしたとき、strのままではダメで、計算する前にfloat型にキャストすることが必要になります。この点に注意して、先ほどのアプリケーションを実装するコードが下記となります。
print("1つ目の数字を入力してください。")
a = input()
print("2つ目の数字を入力してください。")
b = input()
c = float(a) + float(b)
print(a, "+", b, "は", c, "です。")
これを実行すると、入力された2つの数字を足す処理が実装できたことを確認できます。なお、数字以外の要素が入ったstrは、floatにキャストできないことを思い出すと、キーボードで数字以外を入れたときにエラーが出ることが理解できると思います。
リストの型について
リストは複数の要素を持ちますから、intやfloatなどの型で表現することができません。このため、リストには、
- list
という特別な型が与えられています。これを確認するため、以下のコードを実行してみましょう。
list_a = ["こんにちは", 10, 3.14]
print( type(list_a) )
list_aの型はlistであると返ってくると思います。リストはリストなので、そうなります。一方で、リストの個別の要素には型がありそうです。例えば、list_a[0]には「こんにちは」が入っているので、list_a[0]の型はstrだと考えられます。実際にこれはその通りになりますので、すべてチェックしてみます。
list_a = ["こんにちは", 10, 3.14]
print(list_a[0], type(list_a[0]))
print(list_a[1], type(list_a[1]))
print(list_a[2], type(list_a[2]))
これを実行すると、list_aの個別の要素には、str、int、floatといったの型が与えられていることがわかったと思います。ですので、
- list_a[1] + list[2]
はintとfloatの計算なのでエラーが出ないこと、
- list_a[0] + list[1]
はstrとintの計算なのでエラーが出ることなどが分かると思います。
ちなみに、先ほどの型をチェックするコードは、for文を利用して書くこともできます。
list_a = ["こんにちは", 10, 3.14]
n = len(list_a)
for i in range(n):
print(list_a[i], type(list_a[i]))
今回の事例ではリストの長さが3と短いので、for文を使う必要性はあまりありません。一方、リストの長さが100や1万のように長い場合は、for文を使わないのは非現実的です。
以上が、型とキャストの解説となります。基本的な事項なので、ぜひマスターしましょう。