コース一覧
    Pythonループ・関数
    divmod

    Pythonループ・関数

    ループと関数の基本を学び、繰り返し処理を分割して読みやすく書けるようにします。

    1
    ループ
    01. forで合計15分
    02. whileで繰り返す15分
    03. rangeとstep15分
    04. breakとcontinue15分
    05. enumerateで番号付け15分
    06. zipで組み合わせ15分
    07. 入れ子ループ15分
    08. つくる:何件でも記録15分
    09. 第5章クイズ10分
    2
    関数
    01. 関数を定義する15分
    02. 引数と戻り値15分
    03. デフォルト引数15分
    04. キーワード引数15分
    05. 複数の戻り値15分
    06. divmod15分
    07. 変数のスコープ15分
    08. lambda関数15分
    09. つくる:関数に分割15分
    10. 第6章クイズ10分

    divmod

    divmod で商とあまりを一度に

    同じ割り算を 2 回書いている

    友だち 3 人で 1000 円ぶんのお菓子を割り勘するとき、知りたいのは「1 人いくらか」と「いくら余るか」の 2 つです。第 3 章の道具だけで書くと、// と % で同じ割り算を 2 回することになります。

    Python には、この 2 つを 1 回で返す組み込み関数 divmod があります。

    Python

    hour, minute = divmod(170, 60)
    print(hour, minute)

    2 50 が出ます。170 分は 2 時間 50 分だと 1 行で分かりました。前回学んだ複数の戻り値の実物が、標準の関数として最初から用意されているわけです。

    返ってくるのは 2 つ組

    divmod が返すのはタプルで、前が商、うしろが余りです。前回と同じくアンパックで 2 つの変数に分けられます。この学習環境の判定はリスト形式なので、演習では受け取ったあとにリストへ入れ直して返します。

    // と % を 2 回書くのと、答えはまったく同じです。違いは 2 つあります。1 つは意図が伝わることで、divmod と書いてあれば「商と余りをセットで使う」とすぐ分かります。もう 1 つは、割り算を 1 回で済ませていることです。

    引数の順番を逆にすると、エラーは出ないのに答えだけが変わります。divmod(3, 1000) は商が 0、余りが 3 です。割られる数が先、割る数があと、という並びは // や % と同じです。

    解説

    商と余りをセットで使う場面は、割り勘のほかにもたくさんあります。秒を分と秒に、分を時間と分に、個数を箱と端数に。形が同じなら、同じ道具が使えます。

    人数が 0 のとき

    人数が 0 のとき、divmod は ZeroDivisionError になってプログラムが止まります。人数は外から来る値なので、0 が来ないという保証はどこにもありません。

    前回と同じで、危ない入力は関数の入口で弾きます。0 以下が来たときに何を返すかを先に決めておけば、そのあとの行は安心して書けます。

    割り算を書いたら、その場で「0 が来たらどうなるか」を考えます。あとから思い出すことは、まずありません。

    やってみよう

    関数 split_even(total, people) を実装してください。合計金額 total を people 人で割り勘したときの [1人ぶんの金額, 余り] というリストを return します。

    商と余りは divmod で求めます。people が 0 以下のときは [0, 0] を返します。

    手元では split_even(1000, 3) を実行して [333, 1] になることと、333 * 3 + 1 が 1000 に戻ることを確かめてみてください。

    要件

    1. 関数名は split_even で、引数は total と people の 2 つ
    2. 戻り値は [1人ぶんの金額, 余り] のリスト
    3. divmod を使って商と余りを求める
    4. people が 0 以下のときは [0, 0] を返す

    ヒント

    divmod(total, people) は (商, 余り) のタプルを返します

    q, r = divmod(total, people) でアンパックできます

    戻り値はタプルではなく [q, r] のリストにします

    people が 0 以下の場合を先に if で弾いておきます

    生田 陸人
    監修生田 陸人
    ゆめさくエンジニア / 現役ソフトウェアエンジニア監修者プロフィールを見る →
    編集 ゆめさく編集部·公開 2026/08/05·更新 2026/08/26

    関連レッスン

    • 変数のスコープ

      ローカル変数とグローバル変数の違い。外を書き換えるバグを引数と戻り値の形に直す

    • lambda関数

      名前のない小さな関数を式で書く。sorted の key に渡して金額順に並べ替える

    • つくる:関数に分割

      第6章の総仕上げ。件数・合計・残額・予算オーバー判定を辞書で返す summarize を作る

    • 第6章クイズ

      関数の定義と呼び出し、デフォルト引数、複数の戻り値、スコープ、lambda を5問で確認する

    このレッスンに出てくる用語

    意味があいまいなまま進んだ語は、ここから読み直せます。

    • 関数処理に名前を付けて再利用できる単位
    • 戻り値呼び出し元への返答を表す点線矢印
    • タプル順序付きで変更不可のシーケンス
    • 変数データに名前をつけて参照する仕組み
    • リスト順序付きで複数の値を扱うデータ構造
    • セット重複を持たない順序なし集合
    • 引数位置引数=順番で渡す。
    main.py
    エディタを読み込んでいます

    メモ

    divmod

    ⌘S で保存