1. はじめに
Pythonには、割り算の商と余りを同時に取得できる便利な関数としてdivmod()があります。
通常、商は//
(整数除算)、余りは%
(剰余演算子)で個別に計算しますが、divmod()を使えば1回の処理でまとめて取得でき、コードの可読性や実行効率が向上します。
本記事では、「Python|割り算で商と余りを取得する:divmod()」というテーマで、基本的な使い方から応用例、注意点まで詳しく解説します。
この記事を読めば、次のことが分かります:
- divmod()の基本構文と使い方
- 実務での活用例(ループ処理や時間計算など)
- 初心者がつまずきやすいポイントとエラー対策
2. divmod()関数の基本解説
まずはdivmod()
の構文と動作を理解しましょう。
2-1. 基本構文
divmod(a, b)
a
:被除数(割られる数)b
:除数(割る数)- 戻り値:(商, 余り) のタプル
2-2. 基本的な使用例
# 商と余りを取得
result = divmod(17, 5)
print(result) # (3, 2)
print(result[0]) # 商 → 3
print(result[1]) # 余り → 2
実行結果:
(3, 2)
3
2
上記の例では、17 ÷ 5
の商が3
、余りが2
として返されます。
このようにdivmod()
を使えば、1回の計算で商と余りの両方を取得できます。
2-3. タプルのアンパックを使った書き方
Pythonでは、タプルのアンパックを使うとコードがより読みやすくなります。
# 商と余りをそれぞれ変数に代入
quotient, remainder = divmod(23, 4)
print(f"商: {quotient}")
print(f"余り: {remainder}")
実行結果:
商: 5
余り: 3
3. よくある使い方・応用例
divmod()
は単純な割り算だけでなく、さまざまな場面で活用できます。
3-1. 秒数から「分と秒」に変換
動画やタイマーアプリでよく使われるケースです。
# 秒数を分と秒に変換
total_seconds = 367
minutes, seconds = divmod(total_seconds, 60)
print(f"{minutes}分{seconds}秒")
実行結果:
6分7秒
367秒を60で割った商が分、余りが秒として求められます。
3-2. 時間の変換(時・分・秒)
より複雑な時間変換にも活用できます。
# 秒数を時・分・秒に変換
total_seconds = 7324
hours, remainder = divmod(total_seconds, 3600) # 時を取得
minutes, seconds = divmod(remainder, 60) # 分と秒を取得
print(f"{hours}時間{minutes}分{seconds}秒")
実行結果:
2時間2分4秒
3-3. バッチ処理やページ分割
大量のデータを一定数ごとに分割する際にも使えます。
# データ件数とページサイズ
total_items = 53
items_per_page = 10
pages, remaining = divmod(total_items, items_per_page)
print(f"必要なページ数: {pages + (1 if remaining else 0)}")
実行結果:
必要なページ数: 6
divmod()
でページ数と最後の余りデータを簡単に計算できます。
4. 注意点・エラー対策
4-1. 除数が0の場合
divmod()
で除数が0になるとZeroDivisionError
が発生します。
try:
divmod(10, 0)
except ZeroDivisionError:
print("除数が0のため計算できません。")
実行結果:
除数が0のため計算できません。
4-2. 浮動小数点数の扱い
divmod()
は浮動小数点数にも対応していますが、余りの計算は小数で返ります。
q, r = divmod(7.5, 2.5)
print(q, r)
実行結果:
3.0 0.0
整数での計算を期待する場合は、事前に型変換(int()
)を行いましょう。
4-3. マイナスの数の扱い
マイナスの値を扱うと、商と余りの符号に注意が必要です。
print(divmod(-17, 5))
print(divmod(17, -5))
実行結果:
(-4, 3)
(-4, -3)
Pythonのdivmod()
は、商が切り下げ(floor)になるため、期待と異なる場合があります。
5. まとめ
divmod(a, b)
で商と余りを同時に取得できる- 時間変換やページ分割など実務でも活用可能
- 除数が0や負数の場合の挙動に注意
特に、1回の計算で商と余りを取得できるのはパフォーマンス上のメリットもあります。
日常のプログラム作成でも、分や秒の変換、データのバッチ分割など、さまざまなシーンで活用してみましょう。