match文
同じ変数名を 4 回書くことになる
おこづかい帳の一覧に、カテゴリごとの短い記号を頭へ付けたいとします。elif で書くと category == という同じ形が候補の数だけ並びます。候補が 5 つあれば 5 回です。
同じ 1 つの値を、複数の候補と突き合わせるだけ の分岐なら、match 文のほうが短く書けます。
Python
def unit_label(kind):
match kind:
case "円":
return "金額"
case "個":
return "数量"
case _:
return "不明"match のうしろに調べたい値を書き、case のうしろに候補を並べます。行末はどちらもコロンです。比べる相手を 1 回書けば済むので、変数名を打ち間違える場所がそれだけ減ります。
上から順に照合し、最初に当たった case だけが動く点は elif と同じです。match は Python 3.10 から入った文法なので、古い環境では動かないことがあります。
受け皿の case _ を最後に置く
最後の case _ のアンダースコアは ワイルドカード と呼ばれ、上のどれにも当てはまらなかったもの全部を受け止めます。elif の連なりにおける else と同じ役割です。
case _ を書き忘れると、一致しなかったときに match 全体が素通りされます。関数なら return に届かないまま終わるので、戻り値は None になります。エラーは出ないのに答えだけが合わない、という形で表に出るので、書いたら必ず「どれにも当てはまらない値」を 1 つ渡して試します。
matchは値そのものを見る分岐に向いています。price >= 1000のような大小比較には使えないので、そこは素直にifを使います。
クオートを外すと変数として読まれる
case "円": を case 円: と書くと、Python は 円 を これから値を入れる変数名 として扱い、どんな値でも一致してしまいます。文字列と比べたいときは、必ずクオートで囲みます。
インデントも 1 段深くなります。match の中の case で 1 段、case の中身でさらに 1 段です。関数の中で書くと、case の中身は半角スペース 12 個分になります。
やってみよう
関数 category_mark(category) を実装してください。カテゴリ文字列を受け取り、下記の記号を返します。
食費 なら "[食]"、日用品 なら "[日]"、娯楽 なら "[娯]"、交通費 なら "[交]"、それ以外のどんな文字列でも "[他]" です。かっこは半角の [ と ] です。
match で書いてみてください。書き終わったら elif 版に直してみると、どちらが読みやすいか自分の感覚で比べられます。
要件
- 関数名は category_mark で、引数は category の 1 つ
- 食費 / 日用品 / 娯楽 / 交通費 にそれぞれ [食] / [日] / [娯] / [交] を return する
- 上のどれにも当てはまらない文字列にはすべて [他] を return する
- かっこは半角の [ と ] を使う