[Python] 型とキャスト

ここでは、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文を使わないのは非現実的です。

以上が、型とキャストの解説となります。基本的な事項なので、ぜひマスターしましょう。