3秒でわかる
ひとまとまりの処理に名前を付けて、何度でも呼び出せるようにした部品。同じ処理の重複を消し、変更箇所を 1 か所に閉じ込められます。
30秒図解
もう少し詳しく
どういうものか
関数は、いくつかの処理をまとめて名前を付けたものです。呼ぶときに値を渡すことができ、これを引数と呼びます。処理が終わると値を返すことができ、これを戻り値と呼びます。入口 (引数) と出口 (戻り値) が決まっているので、中身がどう書かれているかを知らなくても、名前と引数だけ分かれば使えます。
なぜ必要か
同じ計算を 5 か所に書いた状態で税率が変わると、5 か所を直すことになります。1 か所直し忘れれば、その画面だけ金額が合わないバグになります。関数にまとめておけば、直すのは定義 1 か所です。
もうひとつは、名前が説明になることです。税込み計算の式がそのまま並んでいるコードより、withTax(price) と書かれているほうが、読む側は何をしているのかを一瞬で理解できます。処理を分けること自体より、正しい名前を付けることのほうが効き目が大きい場面は多くあります。
具体例
def with_tax(price, rate=0.1):
return int(price * (1 + rate))
print(with_tax(1000)) # 1100
print(with_tax(1000, 0.08)) # 1080function withTax(price, rate = 0.1) {
return Math.floor(price * (1 + rate));
}
const withTaxArrow = (price, rate = 0.1) => Math.floor(price * (1 + rate));似た用語との違い
| 用語 | 指すもの |
|---|---|
| 引数 | 呼び出し側から渡す値 |
| 戻り値 | 関数が返す値。return が無いと Python は None、JavaScript は undefined |
| メソッド | クラスやオブジェクトに属する関数 |
つまずきやすいところ
print と return を混同するのが最初の関門です。関数の中で print しても、呼び出し元は値を受け取れません。結果を使いたいなら return が必要です。
もうひとつは Python の既定引数の罠です。引数の既定値に空リストを直接書くと、その空リストは関数が定義された時点で 1 つだけ作られ、呼び出しをまたいで共有されます。2 回目の呼び出しでは前回の要素が残ります。既定値には None を置き、関数の中で新しいリストを作るのが定石です。
def add(item, items=None):
if items is None:
items = []
items.append(item)
return items