演算子と型変換|Pythonの最初の1行

このページはプロモーション(広告)を含みます。

Pythonの最初の1行(初級・読む25分+演習35分)

この授業のゴール

仕事でどう使うか

業務の数値は、まず文字列として届くことが多くあります。Webフォームの入力、CSVの列、APIの応答はすべて文字です。それを計算に使うには、数へ型変換する必要があります。また、金額には「端数をどう丸めるか」の規則があり、丸め方を間違えると請求額がずれます。

路線 この授業の使いどころ
DS(データサイエンティスト) 文字列の列を数に直して集計する。割合とパーセントポイントを区別して、施策の効果を報告する
ML(機械学習エンジニア) 特徴量を作る前に、型変換と欠損の扱いを揃える。評価指標(正解率など)の割合を、%表記に直して報告する
DX(DX推進・AI企画) 税・割引・手数料の計算ルール(端数処理を含む)を、仕様書とコードの両方で確認する。切り捨てか四捨五入かで、請求額が1円違う原因を説明する
RS(研究者) 測定値の変換と丸めの規則を明記し、論文の数値が再現できるようにする。整数の除算や余りを使ってデータを分割する

この授業の中心は、「どの型にするか」と「どう丸めるか」を自分で決めて、コードに書くことです。

前提

次の内容を前提とします。

この授業では、「文字で届いた値を数にする」「計算結果を円の整数にする」ところまでを、画面内で実行して確かめます。

身近な状況:フォームから届いた「文字」で割引計算をしたい

注文フォームから、次の3つの値が届きました。

項目 届いた値 意味
価格 '1,980' 円。カンマ付きの文字列
割引 '15' パーセント(15% 引き)
数量 ' 2 ' 個。前後に空白が付いた文字列

これをそのまま計算してみます。

raw_price = '1,980'
code = 'print(raw_price * 0.85)\n'
try:
    exec(compile(code, 'sample.py', 'exec'), {'raw_price': raw_price})
except Exception as e:
    print(type(e).__name__, ':', e)

出力は TypeError : can't multiply sequence by non-int of type 'float' です。文字列に小数は掛けられません。ここで 0.85 を 3 にすると、エラーにならず文字の3回繰り返しになってしまいます(数値・文字列・真偽値)。

解決には3つの作業が必要です。(1) カンマと空白を除く、(2) 数へ変換する、(3) パーセントを割合へ直し、端数の丸め方を決めて計算する。この授業で、順に学びます。

直感的な説明:変換は「文字を数に読み替える」作業、丸めは「端数の扱いの約束」

型変換は、中身を変えずに表し方を替える作業です。文字 '1980' は「1,9,8,0 という4つの文字の並び」で、整数 1980 は「千九百八十という量」です。int('1980') は、文字の並びを読んで量に読み替えます。ただし、読み替えられない文字('1,980' や 'abc')は、エラーになります。変換できないものを、勝手に推測して直すことはありません。

丸めは、計算の結果に端数が出たときの約束です。999 円の商品に 10% の税を掛けると 99.9 円です。1円未満は支払えないので、(1) 99 円にする(切り捨て)、(2) 100 円にする(切り上げ)、(3) 100 円にする(四捨五入)のどれにするかを、先に決める必要があります。計算が合わないとき、原因が丸め方の違いであることは、とても多いです。

注意:丸め方に正解はなく、業務や会社の規則で決まります。コードを書く側は、規則を確認してから実装し、実装した丸め方をコメントに残します。

正確な定義:演算子と変換関数

算術演算子には、前の授業で使った + - * のほか、次のものがあります。

演算子 意味 例 結果 型
/ 割り算 10 / 4 2.5 常に float
// 切り捨て除算(床除算) 10 // 4 2 int どうしなら int
% 余り 10 % 4 2 int どうしなら int
** べき乗 2 ** 10 1024 int どうしなら int

// は「商を負の無限大の方向へ切り捨てる」演算で、-7 // 2 は -4 です(-3.5 を小さい方の整数 -4 に丸める)。% は a == (a // b) * b + a % b を満たす余りです。

比較演算子は ==(等しい)!=(等しくない)< <= > >= で、結果は bool です。論理演算子は and(かつ)or(または)not(否定)で、True / False を組み合わせます。

優先順位(高い順):** → * / // % → + - → 比較 → not → and → or。迷ったら、かっこで明示します。

型変換関数は次のとおりです。

関数 例 結果 条件
int(x) int('1980') 1980 文字列は整数の表記だけ(前後の空白は許される)。'12.5' や '1,980' は ValueError
int(x) int(12.9) 12 小数は0に向かって小数部分を捨てる(int(-12.9) は -12)
float(x) float('12.5') 12.5 小数・整数の表記の文字列
str(x) str(12) '12' どんな値でも文字列にできる
round(x) round(2.5) 2 偶数への丸め(round(3.5) は 4)。四捨五入ではない

文字列を整える道具として、.strip()(前後の空白を除く)と .replace('旧', '新')(文字を置き換える)も使います。たとえば '1,980'.replace(',', '') は '1980' です。

割合とパーセント:割合 $r$ は、全体を 1 とした比率です。パーセント $p$ との関係は
$$ r = \frac{p}{100} $$
です。15% なら $r = 15 / 100 = 0.15$ です。パーセントポイント(pp)は、割合どうしの差の単位です。10% から 15% への変化は $+5$ パーセントポイントで、相対では $15/10 = 1.5$ 倍($+50\%$)です。この2つを混同すると、効果を過大または過小に報告します。

段階付き例題:文字列から、割引後の税込価格(円・切り捨て)まで

問題:価格 '1,980'(円)、割引 '15'(%)、数量 ' 2 ' の注文について、割引後の小計と、10% の税込合計を求める。割引後の小計、税込合計の端数は、どちらも切り捨てとする。

ステップ1:文字列を整えて数にする。

raw_price = '1,980'
raw_rate = '15'
raw_qty = ' 2 '

price = int(raw_price.replace(',', ''))
rate_pct = int(raw_rate)
qty = int(raw_qty)
print(price, type(price).__name__)
print(rate_pct, type(rate_pct).__name__)
print(qty, type(qty).__name__)

出力は 1980 int、15 int、2 int です。' 2 ' の前後の空白は、int() が許してくれます。

ステップ2:数式で整理する。小計 $= \text{価格} \times \text{数量} = 1980 \times 2 = 3960$ 円。割引後は $\text{小計} \times (100 - 15) / 100 = 3960 \times 85 / 100 = 3366$ 円。税込は $3366 \times 110 / 100 = 3702.6$ 円で、切り捨てると 3702 円です。

ステップ3:整数だけで計算する。小数(0.85)を使うと誤差が入り得るので、先に掛け算をして、最後に // で割ると、整数のまま切り捨てができます。

price = 1980
rate_pct = 15
qty = 2
tax_pct = 10

subtotal = price * qty
discounted = subtotal * (100 - rate_pct) // 100
with_tax = discounted * (100 + tax_pct) // 100

print('小計', subtotal)
print('割引後', discounted)
print('税込', with_tax)
print('割引後の型', type(discounted).__name__)

出力は 小計 3960、割引後 3366、税込 3702、割引後の型 int です。

ステップ4:結果を検算する。手計算の 3960 × 0.85 = 3366、3366 × 1.1 = 3702.6(→ 3702)と一致しています。// を使ったので、型も int のままです。

ステップ5:丸め方を替えて、差を確認する。切り上げは、-(-a // b) と書くと整数のまま計算できます(負にして切り捨てて、また負に戻す)。

a = 3366 * 110
b = 100
print('切り捨て', a // b)
print('切り上げ', -(-a // b))
print('四捨五入', (a * 2 + b) // (2 * b))
print('round()', round(a / b))

出力は 切り捨て 3702、切り上げ 3703、四捨五入 3703、round() 3703 です。3702.6 は、四捨五入すると 3703 円です。丸め方が違うと、同じ注文で請求額が1円違うことになります。

操作して理解する:演算子と変換の結果を予想する

実行する前に、各行の出力を紙に予想してください。

print(7 / 2, 7 // 2, 7 % 2, -7 // 2, -7 % 2)
print(int(12.9), int(-12.9), round(2.5), round(3.5), float('12.5'))
print(str(12) + str(3), int('12') + int('3'), '12' * 2)
print(1980 > 1000 and 1980 < 2000, 5 > 3 or 1 / 0, not 1980 == 1980)

答えと理由は次のとおりです。

  1. 3.5 3 1 -4 1:/ は常に小数、// は切り捨て、% は余りです。-7 // 2 は -3.5 を小さい側へ切り捨てて -4、余りは $-7 - (-4)\times 2 = 1$ です。
  2. 12 -12 2 4 12.5:int は0に向かって小数部分を捨てます。round(2.5) は偶数の 2、round(3.5) は 4 です。
  3. 123 15 1212:str で文字にしてからつなげると '123'、int で数にしてから足すと 15、文字列の繰り返しは '1212' です。
  4. True True False:and / or / not は真偽値を組み合わせます。5 > 3 or 1 / 0 の右側は、左側が True の時点で結果が決まるため評価されず、ゼロ除算のエラーが出ません(短絡評価)。

自分で値を替えて試してください。たとえば int('12.5') を実行するとエラーになります。エラーの文面を声に出して読み、どの条件に違反したかを言う練習をしてください(エラーを読んで直す)。

発展:丸めの規則と、実務での金額計算の限界

Pythonの round は四捨五入ではなく偶数への丸め(銀行丸め)です。round(0.5) は 0、round(1.5) は 2、round(2.5) は 2 です。端数が丁度 0.5 の値が多数あるとき、毎回切り上げると全体が偏るため、偶数側へ丸めることで偏りを減らします。さらに、小数 2.675 は2進数の近似のため round(2.675, 2) が 2.67 になります。金額の四捨五入には round を使わず、整数演算か decimal.Decimal を使うのが安全です。

from decimal import Decimal, ROUND_HALF_UP
x = Decimal('2.675')
print(x.quantize(Decimal('0.01'), rounding=ROUND_HALF_UP))
print(round(2.675, 2))

出力は 2.68 と 2.67 です。Decimal に文字列から値を渡すと、10進法の正確な値で計算できます。

税の計算単位:消費税の端数処理は、法令や取引の規則によって、(1) 1品目ごとに処理するか、(2) 請求書の合計に対して1回処理するかが決まっています。両者で合計が数円異なる場合があります。ここでの数値は、規則を確認する前の例です。執筆時点(2026年)の一般的な説明であり、実際の規則は最新の公的情報と取引先の規定で確認してください。

and / or の戻り値:x and y は、x が偽なら x、そうでなければ y を返します(True / False とは限りません)。0 or 5 は 5、'' or '未入力' は '未入力' です。この性質は、初期値の指定に使われますが、0 が「偽」として扱われる点に注意が必要です。

よくある失敗

失敗1:文字のまま足して、数の合計にならない

誤り:フォームから届いた数量を、変換せずに足す。

raw_a = '10'
raw_b = '20'
print(raw_a + raw_b)
print(int(raw_a) + int(raw_b))
print(type(raw_a + raw_b).__name__)

出力は 1020、30、str です。文字列の + はつなぎ合わせなので、'10' + '20' は '1020' になります。エラーが出ないため、合計が 30 でないことに気づかずに報告してしまう危険があります。

直し方:計算の前に int() / float() で数に変換する。変換後に type() で確認する。結果が「桁数の異常に多い数」になっていたら、文字の連結を疑います。

失敗2:変換できない文字列を `int()` に渡す

誤り:小数やカンマの付いた文字列を、直接 int() に渡す。

for raw in [...]: は「リストの値を1つずつ raw に入れて、下の字下げした部分を繰り返す」という書き方です(「forとrange」(有料版) で学びます)。try / except は「try の中を実行し、ValueError が起きたら except の中を実行する」という書き方で、printと入力値 で説明します。

for raw in ['12', '12.5', '1,980', '', 'abc']:
    try:
        print(repr(raw), '->', int(raw))
    except ValueError as e:
        print(repr(raw), '-> ValueError')

出力は、'12' -> 12 の後ろに、'12.5'、'1,980'、''、'abc' がそれぞれ ValueError になる4行が続きます。int() は整数の表記だけを受け付けます。'12.5' を整数にしたいときは int(float('12.5'))(結果は 12)と2段階で変換します。ただし、小数部分が切り捨てられることを意識します。

直し方:(1) .replace(',', '') でカンマを除く、(2) 空文字や変換できない値は「入力不正」として扱う(printと入力値)、(3) 小数が来る可能性があるなら float を経由する。変換できない値を 0 として黙って通すと、未入力が0円に化けます。

失敗3:パーセントを割合として使い、桁がずれる

誤り:15(%)を、割合 0.15 に直さずに計算する。

price = 1980
rate_pct = 15
print(price * (1 - rate_pct))
print(price * (1 - rate_pct / 100))
print(100 - rate_pct / 100)
print((100 - rate_pct) / 100)

出力は -27720、1683.0、99.85、0.85 です。最初は、1 - 15 = -14 と「負の価格」になります。3番目は 100 - 15 / 100 と読まれて(割り算が先)、99.85 になり、意図の 0.85 ではありません。

直し方:変数名で rate_pct(%の数)と rate(割合)を区別し、rate = rate_pct / 100 に変換する。式の結果を常識で検算する(割引後の価格が負になる、定価より高くなる、は異常)。優先順位に自信がなければ、かっこを付けます。

失敗4:`int()` で四捨五入しているつもり/`round` で2.5が3にならない

誤り:端数処理に int() や round() を使い、思った丸め方にならない。

x = 3702.6
print(int(x))
print(round(x))
print(int(-2.9))
print(round(2.5))
print(round(3.5))
print(int(x + 0.5))

出力は 3702、3703、-2、2、4、3703 です。int(x) は切り捨て(0に向かう)なので、3702.6 は 3702 になります。round(2.5) は偶数への丸めで 2 です。int(x + 0.5) は、正の数に限り四捨五入と同じ結果ですが、負の数では成り立ちません。

直し方:業務の規則で丸め方(切り捨て・切り上げ・四捨五入)を確認し、整数演算または Decimal で実装する。コードに丸め方をコメントで書き、3702.6 → 3702 のような具体例でテストします。

まとめ

用語

型変換(type conversion / casting)

値の型を替えること。int('12') は文字列を整数にする。変換できない値は例外になる。

床除算(切り捨て除算)(floor division)

// で求める、商を負の無限大の方向へ切り捨てた整数。

剰余(modulo)

% で求める余り。a == (a // b) * b + a % b を満たす。

パーセントポイント(percentage point)

割合どうしの差の単位。10% から 15% への変化は +5 パーセントポイント。

よくある質問

`int()` と `//` は、どちらも切り捨てですか?

正の数では同じ結果ですが、負の数で違います。int(-3.5) は -3(0に向かう)、-7 // 2 は -4(小さい側へ)です。業務の金額は通常、負にならない値を扱うので、意図を明確にするため、整数どうしの割り算には // を使います。

`/` の代わりに、なぜ `//` を使う例が多いのですか?

/ は常に小数(float)を返し、誤差や端数が残るためです。円の整数を求めるときは、掛け算を先に済ませて最後に // で割ると、誤差なく切り捨てた整数が得られます。小数の割合を使う分析(平均、率)では / を使います。

変換できない文字列が来たら、どうすればよいですか?

エラーを握りつぶさず、入力不正として扱います。次の授業では、try と except ValueError で例外を捕まえて、「受け付けない」と返す方法を学びます。変換できない値を勝手に0にすると、データの意味が変わります。

割合とパーセントは、どちらで持つべきですか?

計算には割合(0.15)、画面や帳票の表示にはパーセント(15%)が一般的です。変数名で rate(割合)と rate_pct(%の数)を区別し、変換は1か所にまとめます。同じ値が文脈で別の単位になるのが、桁違いのバグの典型的な原因です。

切り捨て・切り上げ・四捨五入は、どう決めますか?

契約、会社の経理規程、法令などで決まるので、必ず確認します。この教材の例は、コードの書き方を示すための仮の設定です。決まった丸め方を仕様書に書き、コードのコメントとテストにも同じ例を入れます。

`and` と `or` の結果は、いつも True / False ですか?

比較の結果同士を組み合わせるときは True / False です。ただし 0 or 5 は 5 のように、数や文字列が返ることがあります。条件を作るときは、比較の結果(bool)だけを組み合わせると、予想外の値が出ません。

確認問題

問1 フォームから届いた a = '10'、b = '20' をそのまま a + b と書いたとき、結果はどれか。

  1. ① '1020'(文字列のつなぎ合わせ)
  2. ② 30
  3. ③ TypeError
  4. ④ '30'
解答と解説

正解:①

文字列どうしの + は連結です。エラーが出ないまま、数としての合計にならない値ができる点が危険です。数にするには int(a) + int(b) を使います。

問2 -7 // 2 の値はどれか。

  1. ① -3.5
  2. ② 3
  3. ③ -4
  4. ④ -3
解答と解説

正解:③

// は商を負の無限大の方向へ切り捨てます。$-7 / 2 = -3.5$ の小さい側の整数が $-4$ です。int(-3.5) は 0 に向かうので -3 になり、// と異なります。

問3 int('12.5') を実行すると何が起きるか。

  1. ① 12.5 になる
  2. ② ValueError(整数の表記ではないので変換できない)
  3. ③ 12 になる
  4. ④ 13 になる
解答と解説

正解:②

int() に渡す文字列は整数の表記だけです。小数を整数にしたいなら int(float('12.5')) と2段階にし、結果は 12(切り捨て)です。

問4 割引率 rate_pct = 15(%)から、掛けるべき割合 0.85 を作る式として正しいものはどれか。

  1. ① 100 - rate_pct / 100
  2. ② 1 - rate_pct
  3. ③ 100 - rate_pct // 100
  4. ④ (100 - rate_pct) / 100
解答と解説

正解:④

100 - rate_pct / 100 は割り算が先に計算され、99.85 になります。パーセントを割合に直す式は rate_pct / 100 で、1 - rate_pct / 100 も 0.85 です。

問5 昨年の会員割引率が10%、今年が15%になった。この変化の説明として適切なものはどれか。

  1. ① 1.5パーセントポイントの上昇である
  2. ② 5パーセントポイントの上昇であり、相対的には1.5倍(50%増)である
  3. ③ 5%の上昇である
  4. ④ 50パーセントポイントの上昇である
解答と解説

正解:②

割合どうしの差はパーセントポイント、割合の比は相対的な変化です。「5%上がった」は、どちらの意味か曖昧になります。

問6 round(2.5) と round(3.5) の結果の組はどれか。

  1. ① 2 と 3(切り捨て)
  2. ② 3 と 3(切り上げ)
  3. ③ 2 と 4(偶数への丸め)
  4. ④ 3 と 4(四捨五入)
解答と解説

正解:③

Pythonの round は、ちょうど .5 のとき偶数側へ丸めます。金額の四捨五入には、整数演算や Decimal を使います。

次に学ぶこと

次は printと入力値 で、print の書式(f文字列)と、入力された文字列を安全に数へ変換する方法を学びます。この授業の ValueError を、例外として捕まえる方法です。

この授業の確認問題だけでモジュールの習得とはしません。PY01 の総合テストと自力課題で判定します。条件分岐は 「ifと条件式」(有料版)、例外の詳しい扱いは 「例外と後処理」(有料版) です。

キャリア学習:データサイエンティスト・機械学習エンジニア・DX推進・研究者を目指す人の学習アプリ。164モジュール・984授業を、ブラウザで動くSQLとPythonの演習で。基礎と各分野の最初のモジュールは無料。全部は2,980円の買い切り。

アプリを無料で開く有料版と無料版の違い