Python

【Python】型を変換する方法【キャスト】

この記事では、Pythonでオブジェクトの型を任意の型に変換する方法を解説します。型を変換することで文字列を整数にし、演算に使ったりすることができます。また、型を変換することを「キャスト」と言ったりします。それでは、キャスト方法を見ていきましょう!

型変換とは?

型変換(キャスト)とは、オブジェクトの型を変換することを言います。

具体的には、文字列(str)型のオブジェクトを整数(int)型に変換することができます。そうすることで変換したオブジェクトを演算に使ったり、整数と比較したりすることができます。

キャストしてみる

Pythonでキャストするには、型のコンストラクタを用います。

型名 コンストラクタ
文字列 str()
整数 int()
浮動小数点数 float()
真偽値 boool()

文字列に変換

文字列型に変換するには、str()を使います。以下のコードでは、「整数型」のオブジェクトを「文字列型」に変換しています。

i = 1
print(type(i))

# 変換
s = str(i)
print(type(s))

実行結果

<class 'int'>
<class 'str'>

整数(int)型に変換する

整数型に変換するには、int()を使います。以下のコードでは、「文字列型」のオブジェクトを「整数型」に変換しています。

s = '1'
print(type(s))

# 変換
i = int(s)
print(type(i))

実行結果

<class 'str'>
<class 'int'>

もちろん、変換できない場合もあります。その場合は、ValueErrorが発生します。

s = 'one'

# 変換できない
i = int(s)

実行結果

Traceback (most recent call last):
  File "/Users/user/Desktop/Python/test.py", line 4, in 
    i = int(s)
ValueError: invalid literal for int() with base 10: 'one'

また、float(浮動小数点数)型を変換する場合は、小数点以下は切り捨てられます。

i = int(3.14)
print(i)

i = int(0.99)
print(i)

実行結果

3
0

浮動小数点数(float)型に変換する

浮動小数点数型に変換するには、float()を使います。以下のコードでは、「文字列型」のオブジェクトを「浮動小数点数型」に変換しています。

s = '3.14'
print(type(s))

f = float(s)
print(type(f))

実行結果

<class 'str'>
<class 'float'>

変換できない場合は、整数型と同様にValueErrorが発生します。

s = 'one'

# 変換不可
f = float(s)

実行結果

Traceback (most recent call last):
  File "/Users/user/Desktop/Python/test.py", line 4, in 
    f = float(s)
ValueError: could not convert string to float: 'one'

真偽値(bool)型に変換する

bool型に変換するには、bool()を使います。以下のコードでは、「整数型」から「bool型」のオブジェクトを生成してみます。

b = bool(0)
print(b)

b = bool(1)
print(b)

実行結果

False
True

int や float などの数値型では、0がFalse、それ以外がTrueとして変換されます。文字列や配列は、空ならばFalse、空でなければTrueが生成されます。

0、または空の場合

i = 0
f = 0.0
st = ''
l = []
t = ()
d = {}
s = set()

print(bool(i))   # False 
print(bool(f))   # False
print(bool(st))  # False
print(bool(l))   # False
print(bool(t))   # False
print(bool(d))   # False
print(bool(s))   # False

0、または空でない場合

i = 16362427
f = 0.1
st = 'Hello'
l = [1, 2, 3]
t = ('a', 'b', 'c')
d = {'a': 1, 'b': 2, 'c': 3}
s = {9, 8, 7}

print(bool(i))   # True
print(bool(f))   # True
print(bool(st))  # True
print(bool(l))   # True
print(bool(t))   # True
print(bool(d))   # True
print(bool(s))   # True

配列のキャスト

リストやタプルもキャストすることができます。

リストに変換

リストに変換することで要素を追加・変更・削除することができる。

# タプル
t = (1, 2, 3)
print(t, list(t))

# セット
s = {1, 2, 3}
print(s, list(s))

# range
r = range(3)
print(r, list(r))

# ジェネレータ
g = (i for i in range(3))
print(g, list(g))

実行結果

(1, 2, 3) [1, 2, 3]
{1, 2, 3} [1, 2, 3]
range(0, 3) [0, 1, 2]
<generator object <genexpr> at 0x106b327b0> [0, 1, 2]

タプルに変換

タプルに変換することで要素の追加・変更・削除が行えない。また、リストよりも軽量化できる。

l = [1, 2, 3]
print(l, tuple(l))

実行結果

[1, 2, 3] (1, 2, 3)

セットに変換

セットに変換することで格納されている重複する要素を1つに絞ることができる。

l = [1, 2, 3, 1, 2, 3, 1, 2]
print(l, set(l))

実行結果

[1, 2, 3, 1, 2, 3, 1, 2] {1, 2, 3}

型変換できない場合

型は必ず変換できるとは限りません。なので、型変換できなかった場合の処理が必要となります。例えば、例外処理を使って以下のように記述します。

s = 'one'

# 例外処理
try:
    # エラーが起きそうな処理
    i = int(s)
except:
    # tryブロック内でエラーが起きた場合の処理
    print('型変換に失敗しました。')

実行結果

型変換に失敗しました。

無限ループと組み合わせることで、input関数で整数に変換できる値を受け取るまでループしたりできる。

# 無限ループ
while True:

    # 例外処理
    try:
        # input関数で受け取った値をintに変換
        i = int(input('整数: '))
        # エラーが発生しなければbreakが処理される
        break
    except:
        # tryブロック内でエラーが起きたら処理される
        print('整数を入力してください')

補足: Pythonのキャスト

実はPythonではオブジェクトの型を変換することはできません。

「え?さっきまでキャストできてたやん!」と思うかもしれませんが、先ほどまでのコードは厳密に言えば型のコンストラクタを用いて引数に指定された値から新たにその型のオブジェクトを生成していたに過ぎません。(Pythonで型変換、キャストと言ったらこれ)

型変換前と型変換後のオブジェクトのidを比べることで別のオブジェクトであることがわかります。

n = 260
print(id(n))

f = float(n)
print(id(f))

# 元のオブジェクトの型を調べる
print(type(n))

実行結果

4357068112
4356526800
<class 'int'>

つまりは、

  • Pythonのキャストは新たにオブジェクトを生成している
  • 元のオブジェクトにはなんら変化は無い

ということです。

Pythonで型変換(キャスト)と言われたら「なんらかのオブジェクトから型のコンストラクタを使って新たにオブジェクトを生成する」ということです。

最短3か月でエンジニア転職『DMM WEBCAMP COMMIT』