3秒でわかる
関数を呼び出すときに渡す値のこと。受け取る側の仮引数に対応づけて処理へ持ち込み、同じ処理を違う値で何度も使い回せるようにします。
もう少し詳しく
どういうものか
引数は、関数を呼び出すときに渡す値です。厳密には、呼び出す側が書く値を実引数、関数の定義側で受け取る名前を仮引数と呼び分けます。関数の中では、仮引数はその関数の中だけで通じる変数として扱われます。
渡し方は言語ごとに種類があります。Python なら、順番で対応させる位置引数、名前を指定して渡すキーワード引数、省略できるデフォルト引数、個数が決まらない可変長引数が使えます。
なぜ必要か
引数がなければ、扱う値ごとに関数を書き直すことになります。税込み価格を求める処理は一つで足り、変わるのは金額と税率だけです。変わる部分を引数として外に出しておくと、処理は一箇所にまとまり、修正も一箇所で済みます。
キーワード引数には別の効き目もあります。呼び出し側のコードだけを見て、その値が何を意味するのかが読めるようになります。
具体例
def price_with_tax(amount, rate=0.1, *, round_down=True):
total = amount * (1 + rate)
return int(total) if round_down else total
print(price_with_tax(1000)) # 位置引数だけ
print(price_with_tax(1000, 0.08)) # 税率を位置で
print(price_with_tax(1000, rate=0.08)) # 税率を名前で
print(price_with_tax(1000, round_down=False)) # 名前指定が必須の引数アスタリスク以降は名前を書かないと渡せません。真偽値のような、呼び出し側で意味が読めない値をこの位置に置くと、読みやすさが上がります。
つまずきやすいところ
デフォルト値に空のリストや辞書を書くのが有名な罠です。デフォルト値は関数の定義時に一度だけ作られ、呼び出しのたびに作り直されません。前回の呼び出しで追加した要素が次の呼び出しにも残ります。
def add_item(item, cart=<a href="/glossary/none" class="text-primary font-medium underline underline-offset-2 hover:text-primary-dark">None</a>):
if cart is None:
cart = []
cart.append(item)
return cartNone を既定にして、中で作り直すのが定石です。
もう一つ、渡した変数そのものが書き換わるかどうかの理解です。数値や文字列を渡した場合、関数の中で代入しても呼び出し側の変数は変わりません。リストや辞書を渡して中身を追加した場合は、呼び出し側からも変化が見えます。関数が引数を書き換える設計は事故のもとなので、新しい値を返す形にしておくと安全です。
覚え方
「関数の中で変わる部分だけを外から渡す」。何を引数にするかを決めることは、その関数の役目を決めることでもあります。