Python 逆引き集 | 数値・計算:整数を扱う

Python Python
スポンサーリンク
スポンサーリンク

整数を扱う

Pythonで整数を扱うとき、最初に覚えるべきは「int型」「四則演算」「文字列との変換」「割り算の種類」の4つです。実務では、ユーザー入力、CSVやAPIから受け取った値、在庫数、件数、金額などを整数として処理する場面が非常に多くあります。

Pythonの整数型は int です。大きな特徴として、Python 3の int は多くの言語と異なり、通常の使い方では桁あふれを気にせず非常に大きな整数も扱えます。そのため、件数やIDなど、整数で表すデータは基本として int を使うとよいでしょう。

整数とは何か

整数とは、小数点を含まない数です。たとえば、次のような値が整数です。

  • 0
  • 1
  • -25
  • 1000

一方、次の値は整数ではありません。

  • 3.14:小数
  • 10.0:見た目は整数に見えても、Pythonでは float 型になります
  • "100":数値に見えても、実際は文字列です

Pythonでは、型を type() で確認できます。

# 整数はint型になる
number = 100

# 型を確認する
print(type(number))
# <class 'int'>

# 小数点を付けるとfloat型になる
decimal_number = 100.0

print(type(decimal_number))
# <class 'float'>

# 引用符を付けると文字列になる
text_number = "100"

print(type(text_number))
# <class 'str'>
Python

特に 100 と "100" の違いは重要です。100 は計算できますが、"100" は文字列なので、そのまま足し算するとエラーになります。

# int型の100
a = 100

# 文字列の"100"
b = "100"

# int型同士なら足し算できる
print(a + 1)
# 101

# 文字列とint型を足そうとするとTypeErrorになる
# print(b + 1)
# TypeError: can only concatenate str (not "int") to str
Python

整数の基本演算

整数に対して使える基本的な演算子は次のとおりです。

演算演算子例結果
足し算+7 + 310
引き算-7 - 34
掛け算*7 * 321
割り算/7 / 23.5
割り算の商//7 // 23
割り算の余り%7 % 21
べき乗**2 ** 38

注意したいのは、Pythonでは / を使った割り算は、整数同士でも結果が float になる点です。たとえば 6 / 2 は 3.0 になります。

# 通常の割り算はfloatになる
result = 6 / 2

print(result)
# 3.0

print(type(result))
# <class 'float'>

# 整数の商が欲しい場合は//を使う
quotient = 7 // 2

print(quotient)
# 3

# 余りが欲しい場合は%を使う
remainder = 7 % 2

print(remainder)
# 1
Python

// は「小数点以下を切り捨てる」というより、「床関数(floor)」によって、より小さい整数へ丸める演算です。正の数同士では切り捨てと同じ結果になりますが、負の数では注意が必要です。

割り算の落とし穴:/と//の違い

初心者がつまずきやすいのが、/ と // の違いです。

「/」は必ずfloatになる

# 10を2で割る
print(10 / 2)
# 5.0

# 結果はfloat型
print(type(10 / 2))
# <class 'float'>
Python

割り切れる場合でも、/ の結果は 5 ではなく 5.0 になります。これは仕様です。整数の個数や件数として扱いたい場合は、// を使うか、必要に応じて int() で変換します。

「//」は商を求める

# 17個を3人で分けるとき、1人あたり何個か
total = 17
people = 3

per_person = total // people

print(per_person)
# 5
Python

17を3で割ると5あまり2です。そのため、17 // 3 は 5 になります。

「%」は余りを求める

# 17個を3人で分けたあとの余り
total = 17
people = 3

remainder = total % people

print(remainder)
# 2
Python

// と % は、次の関係があります。

x = 17
y = 3

# 商と余り
quotient = x // y
remainder = x % y

# 商×割る数+余り=元の数
print(quotient * y + remainder)
# 17
Python

つまり、x == (x // y) * y + x % y という関係が成り立ちます。

負の数の割り算に注意する

正の数だけを扱ううちは // も % も直感的です。しかし、負の数が混ざると、結果が直感と異なることがあります。

# 正の数の場合
print(7 // 2)
# 3

print(7 % 2)
# 1

# 負の数の場合
print(-7 // 2)
# -4

print(-7 % 2)
# 1
Python

-7 // 2 が -3 ではなく -4 になるのは、Pythonの // が「0に近づける」のではなく、「より小さい整数へ丸める」ためです。

実務で「マイナスの値も出る可能性がある割り算」を書くときは、// や % の結果を必ずテストしてください。特に、日付計算、座標計算、金額計算、ページング処理などでは、負の数の扱いを確認することが重要です。

商と余りを一度に取得する:divmod()

商と余りの両方が必要なときは、divmod() が便利です。

# 17を3で割ったときの商と余りを同時に取得する
quotient, remainder = divmod(17, 3)

print(quotient)
# 5

print(remainder)
# 2
Python

divmod(x, y) は、(x // y, x % y) と同じ結果をタプルで返します。

たとえば、「合計秒数を分と秒に変換する」処理は次のように書けます。

# 合計125秒を「分と秒」に変換する例
total_seconds = 125

# 60で割った商が分、余りが秒
minutes, seconds = divmod(total_seconds, 60)

print(minutes)
# 2

print(seconds)
# 5

print(f"{minutes}分{seconds}秒")
# 2分5秒
Python

文字列を整数に変換する

実務では、CSV、フォーム入力、APIのJSONなどから受け取る数値が、文字列になっていることがよくあります。その場合は int() を使って整数へ変換します。

# 文字列を整数へ変換する
text = "100"

number = int(text)

print(number)
# 100

print(type(number))
# <class 'int'>

# 整数として計算できる
print(number + 1)
# 101
Python

int() は、整数を表す文字列であれば、前後の空白や符号があっても変換できます。ただし、小数点を含む文字列はそのままでは変換できません。

# 前後の空白や符号はOK
print(int(" 42 "))
# 42

print(int("-15"))
# -15

# 小数点を含む文字列はエラーになる
# print(int("3.14"))
# ValueError: invalid literal for int() with base 10: '3.14'

# 小数点を含む文字列を整数にしたい場合は、一度floatへ変換する
print(int(float("3.14")))
# 3
Python

また、int(3.9) は 4 ではなく 3 になります。int() は四捨五入ではなく、小数部分を切り捨てます。

# int()は小数部分を切り捨てる
print(int(3.9))
# 3

print(int(-3.9))
# -3
Python

変換に失敗する入力へ備える

ユーザー入力や外部データは、必ずしも正しい数値とは限りません。"abc" や空文字列を int() に渡すと、ValueError が発生します。

user_input = "abc"

# そのままint()に渡すとエラーになる
# number = int(user_input)
# ValueError: invalid literal for int() with base 10: 'abc'
Python

実務では、try と except を使って、変換できない入力に備えます。

def parse_int(value, default=0):
    """文字列を整数へ変換する。変換できない場合はdefaultを返す"""

    try:
        # 整数への変換を試みる
        return int(value)

    except (TypeError, ValueError):
        # Noneや数値以外の文字列など、変換できない場合の処理
        return default


# 正常な入力
print(parse_int("100"))
# 100

# 変換できない入力
print(parse_int("abc"))
# 0

# 空文字列
print(parse_int(""))
# 0

# None
print(parse_int(None))
# 0

# デフォルト値を変更することもできる
print(parse_int("abc", default=-1))
# -1
Python

このテンプレートは、フォーム入力、CSV読み込み、APIレスポンスの数値変換など、幅広く使えます。

入力値を安全に整数として受け取る

ユーザーに数値を入力してもらう場合、input() の戻り値は必ず文字列です。そのため、整数へ変換する必要があります。

# ユーザーに年齢を入力してもらう
raw_age = input("年齢を入力してください: ")

try:
    # 文字列を整数へ変換する
    age = int(raw_age)

    # 0以上であることも確認する
    if age < 0:
        print("年齢は0以上で入力してください。")
    else:
        print(f"入力された年齢は{age}歳です。")

except ValueError:
    # 数字として解釈できない入力だった場合
    print("整数を入力してください。")
Python

セキュリティの観点からも、外部からの入力は「正しい形式が来る」と仮定しないことが大切です。数値変換の前後で、値の範囲や型を確認しましょう。

整数かどうかを判定する

「この値は整数か?」を確認したいときは、isinstance() を使います。

value = 100

# valueがint型かどうかを判定する
print(isinstance(value, int))
# True

# float型はintではない
print(isinstance(100.0, int))
# False
Python

ただし、Pythonでは bool 型は int の仲間として扱われる点に注意してください。

# Trueはint型としても扱える
print(isinstance(True, int))
# True

# そのため、True + 1も計算できる
print(True + 1)
# 2
Python

「本当に数値としての整数だけを受け付けたい」場合は、bool を除外するチェックを追加します。

def is_int(value):
    """boolを除外して、整数かどうかを判定する"""

    # boolは除外する
    if isinstance(value, bool):
        return False

    # int型かどうかを判定する
    return isinstance(value, int)


print(is_int(10))
# True

print(is_int(True))
# False

print(is_int(10.0))
# False
Python

整数の比較と論理判定

整数は、if 文で条件分岐によく使われます。

stock = 3

# 在庫が0より大きいか判定する
if stock > 0:
    print("在庫があります。")
else:
    print("在庫がありません。")
Python

主な比較演算子は次のとおりです。

  • ==:等しい
  • !=:等しくない
  • >:より大きい
  • >=:以上
  • <:より小さい
  • <=:以下
score = 80

# 80点以上なら合格
if score >= 80:
    print("合格です。")
else:
    print("不合格です。")
Python

「0以上100以下」のように、範囲を判定するときは and を使います。

age = 25

# 0以上かつ120以下であるかを判定する
if 0 <= age <= 120:
    print("妥当な年齢です。")
else:
    print("年齢として不適切です。")
Python

Pythonでは 0 <= age <= 120 のように、数学と同じ形で範囲を書けます。これは可読性が高く、実務でもおすすめの書き方です。

よくある実務例:在庫数の計算

たとえば、商品の在庫数を管理する簡単な処理を考えてみます。

def update_stock(current_stock, change):
    """在庫数を更新する。

    Args:
        current_stock: 現在の在庫数
        change: 増減数。 positiveは入荷、negativeは出荷

    Returns:
        更新後の在庫数
    """

    # 在庫を更新する
    new_stock = current_stock + change

    # 在庫は0未満にならないようにする
    if new_stock < 0:
        raise ValueError("在庫が不足しています。")

    return new_stock


# 現在の在庫は10個
stock = 10

# 3個入荷する
stock = update_stock(stock, 3)
print(stock)
# 13

# 5個出荷する
stock = update_stock(stock, -5)
print(stock)
# 8

# 在庫を超える出荷はエラーにする
try:
    stock = update_stock(stock, -100)
except ValueError as e:
    print(e)
    # 在庫が不足しています。
Python

このように、整数は単なる計算対象ではなく、「在庫数」「注文数」「エラー回数」「アクセス回数」など、ビジネス上の状態を表すデータとして使われます。そのため、不正な値やありえない範囲の値をチェックする処理も一緒に書く習慣が重要です。

よく使うテンプレート集

安全に文字列を整数へ変換する

def safe_int(value, default=0):
    """変換できない値でもエラーにせず、defaultを返す"""

    try:
        return int(value)

    except (TypeError, ValueError):
        return default
Python

範囲付きで整数を検証する

def validate_int(value, min_value=None, max_value=None):
    """整数であること、および範囲内であることを検証する"""

    # まずintへ変換できるか確認する
    number = int(value)

    # 最小値のチェック
    if min_value is not None and number < min_value:
        raise ValueError(f"{min_value}以上にしてください。")

    # 最大値のチェック
    if max_value is not None and number > max_value:
        raise ValueError(f"{max_value}以下にしてください。")

    return number
Python

数量を指定した個数ずつ分割する

def split_into_batches(total, batch_size):
    """合計数を指定サイズずつ分割したときの、最後のバッチサイズを返す"""

    # バッチサイズが0以下ならエラーにする
    if batch_size <= 0:
        raise ValueError("batch_sizeは1以上にしてください。")

    # 最後のバッチに含まれる件数
    last_batch = total % batch_size

    # ちょうど割り切れた場合は、最後のバッチもbatch_sizeになる
    if last_batch == 0:
        return batch_size

    return last_batch


print(split_into_batches(23, 10))
# 3

print(split_into_batches(20, 10))
# 10
Python

実務で失敗しやすいポイント

  • "100" と 100 を混同しない。文字列はそのまま計算できません。
  • / の結果は float になる。整数の商が必要なら // を使います。
  • int() は四捨五入ではない。int(3.9) は 3 になります。
  • 負の数の // と % は結果が直感と異なることがある。必ずテストしましょう。
  • 外部入力は try・except で検証する。変換できない値や範囲外の値を想定しておくことが大切です。
  • 金額計算では、整数だけで完結するとは限らない。消費税や割引など、小数が必要な計算では Decimal の利用も検討します。

逆引き早見表

やりたいことおすすめの書き方
文字列を整数へ変換するint("100")
変換できない入力に備えるtry: int(value) except ValueError:
整数の商を求める17 // 3
余りを求める17 % 3
商と余りを同時に得るdivmod(17, 3)
整数型か判定するisinstance(value, int)
範囲内か判定する0 <= value <= 100
べき乗を計算する2 ** 10

まとめ

整数を扱ううえで、最初に押さえるべきことは次の3つです。

  • 整数は int 型、文字列の数値は str 型であり、int() で変換する
  • 通常の割り算は /、整数の商は //、余りは % を使う
  • 外部入力やファイル・APIの値は、変換できるか、範囲が適切かを必ず確認する

特に、/ と // の違い、int() が四捨五入ではないこと、負の数の割り算の挙動は、初心者から実務エンジニアまで間違えやすい重要ポイントです。

タイトルとURLをコピーしました