match 文

生田 陸人
LuaGate エンジニア / 現役エンジニア
編集 LuaGate編集部

このレッスンで分かること

  • 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_namematch 文で書いてみます。

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-elseif x == 0: return "Mon" ... else: return "Unknown"条件が値以外 (範囲・他変数との比較) を含む
match-casematch 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):xy は変数束縛で、マッチした値をそのまま変数に取り出して使えます。本レッスンの問題ではここまで踏み込みませんが、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"
diagram (will load when visible)

評価の流れを箇条書きで言い換えると、次のとおりです。

  • n を上から順に case パターンと比較
  • 最初にマッチしたパターンの本体を実行 (それ以降は試さない)
  • どれにも当たらなければ case _: (ワイルドカード) が拾う
  • case _: がないと None が返る

この判定は if / elif でも書けますが、値の一覧と結果の対応が match のほうがすっきり並びます。読者がコードを読んだときに「ここは 7 種類の値に対応している」と一目でわかるのが大きなメリットです。

よくある間違い

  1. Python のバージョン違いmatch は 3.10 以降でしか使えません。古い環境では SyntaxError になります。
  2. case _: 忘れ — フォールバックを書かないと、どのケースにも合わない値で None が返ってしまいます。
  3. case 内で代入が起きるcase x: と書くと「常にマッチして x に束縛する」という意味になり、フォールバック扱いになります。リテラルと変数の混同に注意です。

どうしても変数と比較したいときは case Color.RED: のように 完全修飾名 を使うか、if ガード case x if x == const: を使います。

この章のポイント

ここまでの要点 match は値や構造を上から順に試すパターンマッチ。case _: でフォールバック、| で複数値のまとめ、(x, y) でタプル分解。Python 3.10 以降専用。

やってみよう

関数 day_name(n)match で実装してください。手順は次のとおりです。

  1. def day_name(n): の中で match n: を書く
  2. case 0: から case 6: まで曜日名を返す
  3. case _:"Unknown" を返す
  4. テストで 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 つができることを確認しましょう。

  1. match 文 の要点を自分の言葉で説明できる
  2. このレッスンの最小コード (または操作手順) を見ずに書ける
  3. 練習問題やクイズで間違えた箇所を読み直して理解した

理解度チェック (30 秒)

Q. match 文 とは何か、1 文で説明してください。

この章のポイント

A. 本文の「このレッスンで分かること」または冒頭の説明文を見直し、自分の言葉で要約できれば OK。詰まったら本レッスンの最初の H2 セクションを読み返してみましょう。

関連レッスン

要件

  1. match / case を使って書く
  2. 0..6 を Mon..Sun に対応付ける
  3. 範囲外の値は '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"

ヒント

main.py
main.py
学習モード

メモ

match 文

⌘S で保存