前回:Pythonのデータ型の見分け方!int・float・str・boolをtype()で確認|Python基礎講座 第2回

「"120" と "198" を足したら 120198 になった…」「int() で変換したのに ValueError で止まる…」

型変換でつまずくのは、だいたいこの2つですよね。この記事は、Pythonの基本を1テーマずつ押さえる連載「Python基礎講座」の第3回です。前回はデータ型の見分け方を扱いました。今回はその続きとして、int()・float()・str() による型変換と、変換まわりで出るエラーの読み方を取り上げます。

対象はPythonを始めたばかりの初心者の方で、難易度は入門レベルです。変数と type() がわかれば読み進められます。動作確認は Python 3.13 で行いました。一緒に見ていきましょう! 😊

型変換とは?値の「種類」を作り直すこと

receipt calculator
receipt calculator / Photo by https://kaboompics.com/ via Pexels

型変換とは、ある型の値をもとに、別の型の新しい値を作ることです。

イメージとしては、レシートに印刷された「120」を電卓に打ち直す作業です。紙の上の「120」は文字なので、そのままでは計算できません。電卓に打ち直して、はじめて足し算ができるようになりますよね。Pythonでは、この「打ち直し」を関数で行います。

関数 作る値 例 結果
int() 整数(int) int("120") 120
float() 小数(float) float("0.75") 0.75
str() 文字列(str) str(318) '318'

ポイントは、元の変数は書き換わらないことです。int(apple) と書いても apple は文字列のまま。変換した結果を使いたいときは、そのまま計算に使うか、別の変数に入れます。

サンプル1:文字列の数を int() と float() で計算できるようにする

ファイルやキーボードから受け取った値は、見た目が数でも文字列になっていることがよくあります。レシートのメモを読み取った、という想定で試してみます。

# レシートのメモから読み取った値(ファイルや入力から来た値は文字列になりがち)
apple = "120"
milk = "198"
weight = "0.75"  # kg

print(apple + milk)  # 文字列のまま足すと…

# int() で整数に、float() で小数に変換してから計算する
total = int(apple) + int(milk)
print(total, type(total))

kg = float(weight)
print(kg * 1000, type(kg))
サンプル1の実行結果:変換してから計算すると正しい合計になる
サンプル1の実行結果:変換してから計算すると正しい合計になる

実行結果はこうなりました。

120198
318 <class 'int'>
750.0 <class 'float'>

ここが重要です👇

  • 1行目の 120198 は、"120" と "198" を文字としてつなげた結果です。エラーにならないぶん、気づきにくいのがやっかいなところです ⚠️
  • int(apple) + int(milk) のように変換してから足すと、ちゃんと 318(int)になりました
  • 小数を含む "0.75" は float() で変換します。1000 を掛けた結果は 750.0 と、float のまま表示されます

サンプル2:数と文字列をつなぐときは str()

今度は逆向きです。計算した合計金額に「円」を付けて、値札の文字を作りたいとします。

total = 318

# 値札に表示する文字列を作りたい
label = total + "円"
print(label)

実行すると、エラーで止まりました(ファイルの場所は環境によって変わるので …\ と省略しています)。

Traceback (most recent call last):
  File "…\s2_error.py", line 4, in <module>
    label = total + "円"
            ~~~~~~^~~~~~
TypeError: unsupported operand type(s) for +: 'int' and 'str'

最後の行の TypeError: unsupported operand type(s) for +: 'int' and 'str' は、「int と str の組み合わせでは + が使えません」という意味です。~~~~~~^~~~~~ の印も、+ の部分を指していますね。

前回の第2回では、"25" + 1 のように文字列が左のときに can only concatenate str (not "int") to str が出ました。同じ「型の組み合わせが合わない」エラーでも、左右の順番でメッセージが変わるのがおもしろいところです。どちらも、最後の行に出てくる 'int' や 'str' を見れば、どの型どうしがぶつかったのか読み取れます。

直し方は、str() で数を文字列にしてからつなげることです。

total = 318

# str() で数を文字列に変換してからつなげる
label = str(total) + "円"
print(label)
print("合計は" + label + "です")

# 変換した結果の型も確かめておく
print(type(str(total)), repr(str(total)))
318円
合計は318円です
<class 'str'> '318'
  • str(total) で 318 が文字列の '318' になり、「円」とつなげられました
  • repr() で表示すると '318' とクォート付きになり、文字列になったことがはっきりわかります
  • ちなみに f"合計は{total}円です" のような f文字列を使うと、str() を書かなくても数を文字の中に入れられます。f文字列は別の記事で詳しく扱っているので、ここでは「そういう書き方もある」くらいで大丈夫です

サンプル3:int() で ValueError が出る文字列を調べる

型変換でいちばん多いつまずきが、int() に渡した文字列が整数の形になっていないケースです。たとえば price = "3.5" を int(price) で変換すると、こうなりました。

Traceback (most recent call last):
  File "…\s3_value_error.py", line 2, in <module>
    print(int(price))
          ~~~^^^^^^^
ValueError: invalid literal for int() with base 10: '3.5'

invalid literal for int() with base 10: '3.5' は、「'3.5' は10進数の整数として読めません」という意味です。最後に読めなかった文字列そのものが表示されるので、ここを見れば原因の値がわかります。

では、どんな文字列なら通るのでしょうか。これ、実行せずに答えられますか? 8つの文字列を順番に int() に渡して試してみます。

# int() に渡すと、どれが通ってどれがエラーになる?
samples = ["42", " 42 \n", "42", "-7", "3.5", "1,200", "", "42円"]

for text in samples:
    try:
        print(repr(text), "→", int(text))
    except ValueError as e:
        print(repr(text), "→ ValueError:", e)
サンプル3の実行結果:int()が通る文字列とValueErrorになる文字列
サンプル3の実行結果:int()が通る文字列とValueErrorになる文字列

try: と except ValueError は、「エラーが出ても止まらずに次へ進む」ための書き方です。今回は結果を一覧で見るために使っているだけなので、形だけ眺めればOKです。実行結果はこちら。

'42' → 42
' 42 \n' → 42
'42' → 42
'-7' → -7
'3.5' → ValueError: invalid literal for int() with base 10: '3.5'
'1,200' → ValueError: invalid literal for int() with base 10: '1,200'
'' → ValueError: invalid literal for int() with base 10: ''
'42円' → ValueError: invalid literal for int() with base 10: '42円'

実際に動かしてみて、意外だった点をまとめるとこんな感じです👇

  • 前後の空白や改行は無視される:' 42 \n' も 42 になりました。入力の最後に改行が付いていても大丈夫です
  • 全角数字の '42' も通る:これは少し驚きました。全角で入力されても整数にできます
  • 小数点・カンマ・単位が混ざるとエラー:'3.5'、'1,200'、'42円' は ValueError です
  • 空の文字列 '' もエラー:何も入力せずに Enter を押したときなどに起きます

'1,200' のようなカンマ付きの数は、カンマを取り除いてから変換する必要があります。文字列からカンマを消す方法は、この連載の第10回(文字列メソッド)で扱う予定です。

サンプル4:float を int にすると「切り捨て」になる

int() は小数(float)も整数に変換できます。ただし、四捨五入ではない点に注意です。1,000円を3人で割り勘する計算で確かめます。

# 1,000円を3人で割り勘する
per_person = 1000 / 3
print(per_person)

print(int(per_person))     # 小数点以下を切り捨てる
print(int(-2.7))           # マイナスは 0 に近い方へ
print(round(per_person))   # 四捨五入っぽく丸める
print(round(2.5), round(3.5))  # .5 のときは偶数の方に寄る

# 文字列の "3.9" を整数にしたいときは float() を通してから
print(int(float("3.9")))
333.3333333333333
333
-2
333
2 4
3

ポイントをまとめるとこんな感じです👇

  • int(333.333…) は 333。小数点以下を切り捨てます
  • int(-2.7) は -3 ではなく -2 でした。つまり「小さい方へ」ではなく「0 に近い方へ」切り捨てます
  • 四捨五入したいときは round() を使います。ただし round(2.5) は 3 ではなく 2、round(3.5) は 4 でした。ちょうど真ん中のときは偶数の方に丸める決まりになっています(公式ドキュメントの round() にも書かれています)
  • 文字列の "3.9" を整数にしたいときは、int("3.9") だとサンプル3と同じ ValueError になります。int(float("3.9")) のようにいったん float を通すと 3 になりました

お金の計算で「切り捨て」と「四捨五入」を取りちがえると、合計が1円ずれたりします。どちらにしたいのかを決めてから、int() と round() を選ぶのがおすすめです。

サンプル5:bool() の変換は見た目どおりにならない

最後に、True / False を作る bool() です。設定ファイルから「メール通知するか」を読み込んだら、"False" という文字列だった…という場面を考えます。

# 設定ファイルから読んだ「メール通知するか」の値
notify = "False"

print(bool(notify))  # True と False、どっちが出る?

print(bool(""), bool("0"), bool(0), bool(0.0))

# 文字列で判定したいときは、文字列どうしで比べる
print(notify == "True")
True
False True False False
False
  • bool("False") は、なんと True でした。bool() は文字列の中身を読むのではなく、空かどうかだけを見ているためです
  • 2行目のとおり、False になったのは空の文字列 "" と、数の 0 と 0.0 だけ。文字列の "0" は空ではないので True です
  • 文字列で「True かどうか」を判定したいときは、notify == "True" のように文字列どうしで比べるのが確実です。比較演算子は第6回で詳しく扱います

型変換で迷ったときのチェックリスト

こうしたい 書き方 注意点
文字列の整数で計算したい int("120") 小数点・カンマ・単位・空文字は ValueError
文字列の小数で計算したい float("0.75") 結果は float になる
数を文字とつなげたい str(318) + "円" f文字列なら str() は不要
小数を整数にしたい int(3.9) / round(3.9) int() は0に近い方へ切り捨て、round() は真ん中なら偶数寄り
文字列の “3.9” を整数にしたい int(float("3.9")) int("3.9") は ValueError
“True” / “False” の文字列を判定したい text == "True" bool("False") は True になる

エラーが出たら、まず最後の行のエラー名を見ます。TypeError なら「型の組み合わせが合わない」ので変換し忘れを疑い、ValueError なら「変換しようとした値の中身がおかしい」ので、メッセージの最後に出ている値を確かめましょう。

まとめ

  • 型変換は別の型の新しい値を作ること。int()・float()・str() を使い、元の変数は変わらない
  • 文字列の数どうしの + は連結になる。計算する前に int() / float() で変換する
  • 数と文字列をつなぐときは str()。忘れると TypeError
  • int() は前後の空白や全角数字はOK、小数点・カンマ・単位・空文字は ValueError
  • float → int は 0 に近い方へ切り捨て。round() はちょうど真ん中のとき偶数に丸める
  • bool("False") は True。文字列の判定は == "True" で比べる

次回の第4回は、input() でキーボードから値を受け取る方法を取り上げます。今回の型変換がさっそく活躍しますよ。サンプル3の samples に自分で思いついた文字列を足して、int() が通るかどうか、ぜひ試してみてください! 🚀

\ 読んだら、次は自分で作ってみよう /

筆者が運営する無料の入門コース「作って学ぶPythonプログラミング入門」では、こうした基本文法を、割り勘計算機・おみくじ・数当てゲームなどを作りながら身につけます。各章末の定着ドリル(全42問)で、自分の手で書く練習まで。最初の4レッスンは登録なしで読めます。

→ 無料の入門コース(全7章52レッスン)を見てみる

📚 関連商品・おすすめ書籍

スッキリわかるPython入門 第2版 (スッキリわかる入門シリーズ)

もしも

スッキリわかるPython入門 第2版 (スッキリわかる入門シリーズ)

初心者に定番のPython入門書

Amazonで見る
徹底攻略! 電子工作&プログラミング Arduinoで学ぶ電子工作完全ガイド

もしも

徹底攻略! 電子工作&プログラミング Arduinoで学ぶ電子工作完全ガイド

電子工作とプログラミングを同時に学べる

Amazonで見る
実践Claude Code入門―現場で活用するためのAIコーディングの思考法

もしも

実践Claude Code入門―現場で活用するためのAIコーディングの思考法

AIコーディングの現場活用法を学ぶ一冊

Amazonで見る

※本記事にはアフィリエイトリンクが含まれます。

ABOUT ME
やまちゃん
これまで学生と社会人を合わせて5000人以上にプログラミング学習を指導。 ゼロからイチをわかりやすく解説する専門家として活動しており、本業ではArduinoを用いたIoT開発とロボットプログラミングが専門。 Pythonを用いたアプリ開発、ウェブアプリケーションの開発で業務の効率化をサポートしています。