演算子と型変換|Pythonの最初の1行
このページはプロモーション(広告)を含みます。
Pythonの最初の1行(初級・読む25分+演習35分)
この授業のゴール
///%**と比較・論理演算子の結果(値と型)を、実行前に予想できるint()float()str()で型を変換し、変換できない文字列がエラーになる条件を説明できる- 文字列で届いた価格・数量・割引率(%)から、切り捨て・切り上げ・四捨五入を指定して円の整数を計算できる
- 割合とパーセント、パーセントポイントを区別して、数値を計算・説明できる
仕事でどう使うか
業務の数値は、まず文字列として届くことが多くあります。Webフォームの入力、CSVの列、APIの応答はすべて文字です。それを計算に使うには、数へ型変換する必要があります。また、金額には「端数をどう丸めるか」の規則があり、丸め方を間違えると請求額がずれます。
| 路線 | この授業の使いどころ |
|---|---|
| DS(データサイエンティスト) | 文字列の列を数に直して集計する。割合とパーセントポイントを区別して、施策の効果を報告する |
| ML(機械学習エンジニア) | 特徴量を作る前に、型変換と欠損の扱いを揃える。評価指標(正解率など)の割合を、%表記に直して報告する |
| DX(DX推進・AI企画) | 税・割引・手数料の計算ルール(端数処理を含む)を、仕様書とコードの両方で確認する。切り捨てか四捨五入かで、請求額が1円違う原因を説明する |
| RS(研究者) | 測定値の変換と丸めの規則を明記し、論文の数値が再現できるようにする。整数の除算や余りを使ってデータを分割する |
この授業の中心は、「どの型にするか」と「どう丸めるか」を自分で決めて、コードに書くことです。
前提
次の内容を前提とします。
- 数値・文字列・真偽値の型と
type()→ 数値・文字列・真偽値 - 変数と代入 → 変数と代入
- 四則計算と計算順序、分数・小数・比(10% は 0.1)→ 四則計算と計算順序、分数と小数と比
- 負数と数直線(切り捨てが負の数で逆向きになる理由の理解に使います)→ 負数・絶対値・数直線
この授業では、「文字で届いた値を数にする」「計算結果を円の整数にする」ところまでを、画面内で実行して確かめます。
身近な状況:フォームから届いた「文字」で割引計算をしたい
注文フォームから、次の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)
答えと理由は次のとおりです。
3.5 3 1 -4 1:/は常に小数、//は切り捨て、%は余りです。-7 // 2は-3.5を小さい側へ切り捨てて-4、余りは $-7 - (-4)\times 2 = 1$ です。12 -12 2 4 12.5:intは0に向かって小数部分を捨てます。round(2.5)は偶数の2、round(3.5)は4です。123 15 1212:strで文字にしてからつなげると'123'、intで数にしてから足すと15、文字列の繰り返しは'1212'です。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 のような具体例でテストします。
まとめ
- 文字列は計算の前に
int()/float()で数へ変換する。'10' + '20'は'1020'で、数の合計 30 ではない。 int()が受け付けるのは整数の表記だけ。'12.5'、'1,980'、''はValueErrorになる。/は常に float、//は切り捨て、%は余り。整数どうしなら、先に掛けて最後に//で割ると整数のまま切り捨てられる。- 丸め方(切り捨て・切り上げ・四捨五入)は業務の規則で決める。Python の
roundは偶数への丸めで、四捨五入とは異なる。 - 割合 $r = p/100$。割合の差はパーセントポイント、割合の比は相対的な増減で、報告では区別する。
用語
- 型変換(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 と書いたとき、結果はどれか。
- ① '1020'(文字列のつなぎ合わせ)
- ② 30
- ③ TypeError
- ④ '30'
解答と解説
正解:①
文字列どうしの + は連結です。エラーが出ないまま、数としての合計にならない値ができる点が危険です。数にするには int(a) + int(b) を使います。
問2 -7 // 2 の値はどれか。
- ① -3.5
- ② 3
- ③ -4
- ④ -3
解答と解説
正解:③
// は商を負の無限大の方向へ切り捨てます。$-7 / 2 = -3.5$ の小さい側の整数が $-4$ です。int(-3.5) は 0 に向かうので -3 になり、// と異なります。
問3 int('12.5') を実行すると何が起きるか。
- ① 12.5 になる
- ② ValueError(整数の表記ではないので変換できない)
- ③ 12 になる
- ④ 13 になる
解答と解説
正解:②
int() に渡す文字列は整数の表記だけです。小数を整数にしたいなら int(float('12.5')) と2段階にし、結果は 12(切り捨て)です。
問4 割引率 rate_pct = 15(%)から、掛けるべき割合 0.85 を作る式として正しいものはどれか。
- ① 100 - rate_pct / 100
- ② 1 - rate_pct
- ③ 100 - rate_pct // 100
- ④ (100 - rate_pct) / 100
解答と解説
正解:④
100 - rate_pct / 100 は割り算が先に計算され、99.85 になります。パーセントを割合に直す式は rate_pct / 100 で、1 - rate_pct / 100 も 0.85 です。
問5 昨年の会員割引率が10%、今年が15%になった。この変化の説明として適切なものはどれか。
- ① 1.5パーセントポイントの上昇である
- ② 5パーセントポイントの上昇であり、相対的には1.5倍(50%増)である
- ③ 5%の上昇である
- ④ 50パーセントポイントの上昇である
解答と解説
正解:②
割合どうしの差はパーセントポイント、割合の比は相対的な変化です。「5%上がった」は、どちらの意味か曖昧になります。
問6 round(2.5) と round(3.5) の結果の組はどれか。
- ① 2 と 3(切り捨て)
- ② 3 と 3(切り上げ)
- ③ 2 と 4(偶数への丸め)
- ④ 3 と 4(四捨五入)
解答と解説
正解:③
Pythonの round は、ちょうど .5 のとき偶数側へ丸めます。金額の四捨五入には、整数演算や Decimal を使います。
次に学ぶこと
次は printと入力値 で、print の書式(f文字列)と、入力された文字列を安全に数へ変換する方法を学びます。この授業の ValueError を、例外として捕まえる方法です。
この授業の確認問題だけでモジュールの習得とはしません。PY01 の総合テストと自力課題で判定します。条件分岐は 「ifと条件式」(有料版)、例外の詳しい扱いは 「例外と後処理」(有料版) です。
キャリア学習:データサイエンティスト・機械学習エンジニア・DX推進・研究者を目指す人の学習アプリ。164モジュール・984授業を、ブラウザで動くSQLとPythonの演習で。基礎と各分野の最初のモジュールは無料。全部は2,980円の買い切り。
アプリを無料で開く有料版と無料版の違い