Python講座 / 関数を定義し、戻り値を返す

関数は処理に名前を付け、引数を受け取って結果を返す仕組みです。結果をreturnすることと画面へprintすることを分けると、同じ計算を別の場所でも利用しやすくなります。

定義・引数・結果の役割を読む

defは関数名と字下げされた本体を定義します。定義に書く名前が仮引数、呼び出すときに渡す値が実引数です。関数を定義しただけでは、その本体は実行されません。

returnは現在の呼び出しを終了し、結果を呼び出し元へ返します。値を返すreturnへ到達せず終わるとNoneになります。計算結果を表示するだけの関数と、結果を値として返す関数では、呼び出した後にできることが異なります。

関数呼び出しの規則と名前の範囲は、変数のスコープ・別名・可変オブジェクトを理解するで扱う規則とつながります。

関数を呼び出して結果を再利用する

functions.pyへ全体コードをUTF-8で保存し、仮想環境でpython functions.pyを実行します。

def total_with_fee(amount, fee):
    """Return the sum of the amount and fee."""
    return amount + fee

first = total_with_fee(8000, 500)
second = total_with_fee(3500, 0)
print(first, second)
print(first + second)

予想結果です。二回の呼び出しで得た値を、最後にもう一度足しています。

8500 3500
12000

関数の責務と前提を決める

この例は、足し合わせられる二つの数値を受け取ることが前提です。負数や端数を認めるかは別の契約になります。適切な境界でデータを検証し、内部の小さな関数には前提を明示します。すべての関数に、考えられる入力を無制限に扱わせる必要はありません。

処理の内容を表す名前を付け、入力要求、計算、ファイル保存を一つへ詰め込みすぎないようにします。docstringには結果、必要な条件、関係する例外を説明し、コードが保証していない性質を書かないでください。

戻り値と呼び出しの失敗を調べる

feeを500から1000へ変えると、最初の結果は9000になります。returnを一時的にprintへ替え、firstに何が入るかを確認したら戻します。関数定義が実行される前に呼び出すと、名前が未定義になることも試せます。

関数内のローカル変数は、通常は外側から直接読めません。必要な値をreturnで返し、隠れた外部状態へ依存させないようにします。引数不足のTypeErrorなら、定義と呼び出しを照合します。省略可能な値は引数と既定値で扱います。

returnは関数を終了して呼び出し元に値を返します。printは表示する処理で、print自体の戻り値はNoneです。合計を別の計算やテストで使うならreturnし、表示するかどうかは呼び出し元が決めます。

操作 結果 観察
return total 呼び出し元へtotal 表示なし
print(total) None 画面に表示

関連する公式リファレンス