3秒でわかる
処理のまとまりに名前と引数を与えて、あとから何度でも呼べる形にする書き方。同じコードの重複を消し、変更点を一か所にまとめるために使います。
もう少し詳しく
どういうものか
関数定義は、いくつかの処理をひとまとめにして名前を付け、外から値を受け取る口と、結果を返す口を決める作業です。Python なら def、JavaScript なら function もしくはアロー関数の記法を使います。定義した時点では中身は動かず、名前を書いて呼び出したときに初めて実行されます。この「定義」と「呼び出し」が別物であることが、最初の分かれ目になります。
なぜ必要か
同じ計算を三か所に書き写したコードは、仕様が変わったときに三か所とも直す必要があります。一か所直し忘れれば、それがそのまま不具合になります。関数にまとめておけば直す場所は一か所です。
もうひとつの効果は名前が付くことです。税込価格を求める 5 行の式より、calc_tax_included という呼び出し 1 行のほうが、読んだときに何をしているか早く分かります。関数は再利用の道具であると同時に、コードに見出しを付ける道具でもあります。
具体例
Python の定義と呼び出しです。引数に既定値を持たせ、戻り値を return で返しています。
def calc_tax_included(price, rate=0.1):
return int(price * (1 + rate))
print(calc_tax_included(1000)) # 1100
print(calc_tax_included(1000, 0.08)) # 1080同じことを JavaScript で書くと下のようになります。
const calcTaxIncluded = (price, rate = 0.1) => Math.floor(price * (1 + rate));
console.log(calcTaxIncluded(1000)); // 1100つまずきやすいところ
return を書き忘れる誤りが非常に多いです。Python では return のない関数は None を返すため、結果を変数に入れて表示すると None と出ます。関数の中で print しているだけで返していないケースも同じです。画面に出ることと、値が返ることは別だと意識してください。
Python 固有の罠として、既定値にリストや辞書を書くと、その 1 個が呼び出しをまたいで使い回されます。def add(item, box=[]) と書くと、2 回目の呼び出しで前回の要素が残ります。既定値には None を置き、関数の中で新しいリストを作るのが定石です。
覚え方
定義は料理のレシピを書く作業、呼び出しは実際に作る作業です。レシピを書いただけでは食べられません。引数が材料、戻り値が完成した料理にあたると考えると、return の必要性が納得しやすくなります。