match 文
このレッスンで分かること
match 値:+case パターン:でパターンマッチング、Python 3.10以降の構文ですcase _:はワイルドカードで、上のいずれにも当てはまらないときのフォールバックです- 最小例は
match n: case 0: return "Mon"; ...; case _: return "Unknown"
match 文 とは
match / case を使って値に応じた処理を書き分ける関数を実装する。本レッスンでは、match 文 の基本から実際の使いどころまでを整理し、現場で迷わず使える形に落とし込みます。
match 文
Python 3.10 で追加された match 文は、いわゆる「パターンマッチング」を提供する新しい構文です。switch 文を持つ他言語に近い見た目ですが、リテラルだけでなくリスト、タプル、辞書、dataclass などの 構造 を扱える本格的なパターンマッチで、単なる多分岐の書き換え以上のことができます。本レッスンでは、曜日番号 (0 から 6) を受け取って曜日名 ("Mon", "Tue", ... ) を返す関数 day_name を match 文で書いてみます。
「
matchは switch ではなくパターンマッチである」と最初に意識しておくと、後で構造を扱う場面で詰まりにくくなります。
match の基本文法
match 文は次の形を取ります。match 行に評価対象の値を置き、case 行に「マッチさせたいパターン」を置きます。case _: はワイルドカードで、上のいずれにも当てはまらないときのフォールバックです。
Python
def status_label(code):
match code:
case 200:
return "OK"
case 404:
return "Not Found"
case 500:
return "Server Error"
case _:
return "Unknown"case 200: のような数値リテラルだけでなく、case "GET" | "HEAD": のように | で複数のパターンを並べることもできます。if / elif を縦に並べるよりも、値と結果の対応関係が見やすくなるのが match の魅力です。
case _:を忘れると、どのパターンにも当てはまらなかったときにNoneが返るので注意します。
if-elif と match の対応
同じ多分岐を 2 つの書き方で並べると違いがよく分かります。
| 書き方 | コード例 | 向いている場面 |
|---|---|---|
if-elif-else | if x == 0: return "Mon" ... else: return "Unknown" | 条件が値以外 (範囲・他変数との比較) を含む |
match-case | match x: case 0: return "Mon" ... case _: return "Unknown" | 値や構造の対応表が中心 |
| 辞書 lookup | {"0": "Mon", ...}.get(x, "Unknown") | 純粋なキー → 値の対応 |
値だけでなく構造もマッチできる
match 文の真価は、リストやタプル、辞書などの形そのものをパターンとして書ける点にあります。たとえば座標 (0, 0) を「原点」と判定するパターンは次のように書けます。
Python
def classify_point(point):
match point:
case (0, 0):
return "origin"
case (0, _):
return "y-axis"
case (_, 0):
return "x-axis"
case (x, y):
return f"point({x},{y})"(0, _) の _ はワイルドカードで「2 要素タプルで先頭が 0 なら何でも OK」という意味になります。case (x, y): の x と y は変数束縛で、マッチした値をそのまま変数に取り出して使えます。本レッスンの問題ではここまで踏み込みませんが、match の世界の広さを知っておくと、後で複雑な分岐を書くときに思い出せます。
動きを追ってみる
本レッスンの関数 day_name(n) は曜日番号 0 から 6 を "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun" に対応付けます。範囲外の値が来たら "Unknown" を返します。match で書くと次のとおりです。
Python
def day_name(n):
match n:
case 0:
return "Mon"
case 1:
return "Tue"
case 2:
return "Wed"
case 3:
return "Thu"
case 4:
return "Fri"
case 5:
return "Sat"
case 6:
return "Sun"
case _:
return "Unknown"評価の流れを箇条書きで言い換えると、次のとおりです。
nを上から順にcaseパターンと比較- 最初にマッチしたパターンの本体を実行 (それ以降は試さない)
- どれにも当たらなければ
case _:(ワイルドカード) が拾う case _:がないとNoneが返る
この判定は if / elif でも書けますが、値の一覧と結果の対応が match のほうがすっきり並びます。読者がコードを読んだときに「ここは 7 種類の値に対応している」と一目でわかるのが大きなメリットです。
よくある間違い
Pythonのバージョン違い —matchは 3.10 以降でしか使えません。古い環境ではSyntaxErrorになります。case _:忘れ — フォールバックを書かないと、どのケースにも合わない値でNoneが返ってしまいます。case内で代入が起きる —case x:と書くと「常にマッチしてxに束縛する」という意味になり、フォールバック扱いになります。リテラルと変数の混同に注意です。
どうしても変数と比較したいときは
case Color.RED:のように 完全修飾名 を使うか、ifガードcase x if x == const:を使います。
ここまでの要点
match は値や構造を上から順に試すパターンマッチ。case _: でフォールバック、| で複数値のまとめ、(x, y) でタプル分解。Python 3.10 以降専用。
やってみよう
関数 day_name(n) を match で実装してください。手順は次のとおりです。
def day_name(n):の中でmatch n:を書くcase 0:からcase 6:まで曜日名を返すcase _:で"Unknown"を返す- テストで 7 + 範囲外の 1 ケースが全部 pass するか確認する
書き終わったら、case 0 | 6: のように | でパターンを束ねて「平日か週末か」を返す版を試してみると、match の表現力をさらに体感できます。
よくある質問
Q. このトピックは Python 以外の言語でも同じ書き方ですか?
A. 考え方は他言語と共通ですが、構文や標準ライブラリは異なります。Python はインデントでブロックを表し、コロン + 改行で構造を作るのが特徴です。他言語に移行する際は基本概念を維持しつつ、構文の差分を意識して書き換えると混乱が少ないです。
Q. 実行してエラーが出た場合の対処は?
A. エラーメッセージの最後の行(TypeError や NameError などの型)から原因と該当行を確認します。Python はトレースバックが下から上に読むと「呼び出し元 → 内部」の順で辿れます。print や IDE のデバッガで途中の変数を確認すると原因が見えてきます。
Q. 次のステップで何を学ぶべきですか?
A. 本レッスンの内容を理解できたら、本文の「やってみよう」を実装し、章末クイズに進むのがおすすめです。さらに自分のミニアプリ(電卓・todo・スコア集計など)に応用するとスキルが定着します。詰まったら本文の H2 セクションに戻って読み返してください。
次のレッスン
次は 早期 return で読みやすく で、match / case を使って値に応じた処理を書き分ける関数を実装する を学びます。
事前確認 — 進む前に次の 3 つができることを確認しましょう。
- match 文 の要点を自分の言葉で説明できる
- このレッスンの最小コード (または操作手順) を見ずに書ける
- 練習問題やクイズで間違えた箇所を読み直して理解した
理解度チェック (30 秒)
Q. match 文 とは何か、1 文で説明してください。
A. 本文の「このレッスンで分かること」または冒頭の説明文を見直し、自分の言葉で要約できれば OK。詰まったら本レッスンの最初の H2 セクションを読み返してみましょう。
関連レッスン
要件
- match / case を使って書く
- 0..6 を Mon..Sun に対応付ける
- 範囲外の値は 'Unknown' を返す (case _ でフォールバック)
入出力例
test-cases.txt
day_name(0) → "Mon"
day_name(1) → "Tue"
day_name(3) → "Thu"
day_name(6) → "Sun"
day_name(7) → "Unknown"
day_name(-1) → "Unknown"