キーワード引数
True が何の True か分からない
引数が増えてくると、呼び出し側の見た目がこうなります。
Python
make_line("りんご", 120, "食費", True)最後の True が何の True なのか、この行だけでは分かりません。関数の定義を見に行かないと読めないコードは、それだけであとの手間になります。
Python には、引数を 名前で指定して渡す 書き方があります。これをキーワード引数と呼びます。
Python
def title(text, line=False):
if line:
return "=== " + text + " ==="
return text
print(title("おこづかい帳", line=True))line=True と書いてあるので、この True が何のためのものか一目で分かります。呼び出し側に 1 語足すだけで、定義を見に行かずに読めるようになります。
コードは書く時間より読む時間のほうがずっと長いです。読んだだけで意味が分かる呼び出しを書けると、あとの自分が助かります。
名札を付ければ、順番は自由
位置引数は前から順に詰まるので順番を変えられませんが、名前で指定したものは名札が付いているので取り違えようがありません。
Python
def date_label(day, month=8, year=2026):
return str(year) + "/" + str(month) + "/" + str(day)
print(date_label(24, year=2025, month=3))
print(date_label(24, month=3, year=2025))2 行とも 2025/3/24 になります。名前で渡すぶんには、書く順番は結果に影響しません。
引数名を打ち間違えると TypeError になり、unexpected keyword argument と出ます。定義側の綴りを見に行けばすぐ直せます。
名前なしの引数が先
混ぜて書くときは、名前なしの引数が必ず先です。date_label(day=24, 3) は SyntaxError になり、positional argument follows keyword argument と出ます。先に名札付きを置いてしまうと、そのあとの値がどこに入るべきか決められなくなるためです。
同じ引数へ位置とキーワードの両方から値を渡すのも TypeError です。date_label(24, 3, year=2025) なら問題ありませんが、date_label(24, 3, 2025, year=2024) は year に 2 回値が来てしまいます。どちらか片方にします。
やってみよう
関数 format_record(name, price, category="その他", show_category=False) を実装してください。品名 name と金額 price から "りんご 120円" の形の 1 行を作って return します。
show_category が True のときだけ、うしろに半角スペースと (食費) のようなカテゴリを足します。かっこは半角、スペースは半角 1 つです。category の既定値は "その他"、show_category の既定値は False です。
手元では format_record("りんご", 120) と format_record("りんご", 120, category="食費", show_category=True) の 2 通りを試して、名前で渡す読みやすさを確かめてみてください。
要件
- 関数名は format_record で、引数は name, price, category, show_category の 4 つ
- category の既定値は "その他"、show_category の既定値は False
- 基本の形は "品名 金額円" で、品名と金額の間は半角スペース 1 つ
- show_category が True のときだけ、うしろに半角スペースと半角かっこでカテゴリを足す
入出力例
format_record("りんご", 120) → "りんご 120円"
format_record("りんご", 120, "食費", true) → "りんご 120円 (食費)"
format_record("ノート", 200, "日用品", false) → "ノート 200円"
format_record("おまけ", 0, "その他", true) → "おまけ 0円 (その他)"
format_record("定期券", 10250, "交通費", true) → "定期券 10250円 (交通費)"