Python 3.10で導入されたmatch/case文(パターンマッチング)をご存じですか?
他のプログラミング言語には「switch/case文」が存在しますが、Pythonにはこれまでありませんでした。しかしPython 3.10からは、それをはるかに超える強力なmatch/case文が使えるようになっています。
📌 この記事でわかること
- Python match/case文の基本的な書き方
- switch/case文との違い
- リスト・タプル・クラスへの応用例
- ガード条件(if節)の使い方
- 実務でそのまま使えるサンプルコード
※ if/else/elif を理解していると、より読み進めやすいです。if文の基本はこちらの記事をご覧ください。
👉 Pythonでswitch/caseを代替する方法【if文で解決】
match/case文とは?【Python 3.10の新機能】
match/case文は、Python 3.10で正式に導入されたパターンマッチングの構文です。
単純な値の比較から、リスト・タプル・辞書・クラスといった複雑なデータ構造のマッチングまで、幅広く活用できます。
従来の switch/case 文(他言語)が「完全一致の比較」しかできなかったのに対し、Pythonのmatch/case文は構造そのものを分解してマッチングできるのが最大の特徴です。
match/case文の基本構文
まず基本的な書き方を確認しましょう。
match 変数:
case パターン1:
# パターン1に一致した場合の処理
case パターン2:
# パターン2に一致した場合の処理
case _:
# どれにも一致しない場合(デフォルト)
case _: はワイルドカードと呼ばれ、「どのパターンにも一致しなかった場合」に実行されます。他言語の default: に相当します。
【基本】リテラルのマッチング
もっとも基本的な使い方が、値を直接比較するリテラルマッチングです。
たとえば、成績(A〜D)に応じてメッセージを出力する例を見てみましょう。
evaluation = 'B'
match evaluation:
case 'A':
print('あなたは素晴らしい!')
case 'B':
print('もう少し頑張りましょう')
case 'C':
print('あと少しで卒業できなくなるところでした')
case 'D':
print('あなたは卒業ができません')
case _:
print('正しい成績を入力してください')
実行結果:
もう少し頑張りましょう
match evaluation: で指定した変数の値(’B’)と一致する case 'B': が実行されます。
従来の switch/case 文でできたことは、この「完全一致の比較」のみです。Pythonのmatch/case文はここからさらに強力になります!
【応用1】シーケンスのアンパック(リスト・タプル)
match/case文では、リストやタプルの要素を個別に取り出してマッチングすることができます。これを「シーケンスパターン」と呼びます。
従来の switch/case 文ではまったく不可能だった、非常に強力な機能です。
# ユーザー情報のリスト(要素数が異なるケースを想定)
user_info_list = [("Alice", 30, "Tokyo"), ("Bob", 25), ("Charlie",)]
for user in user_info_list:
match user:
case (name, age, city):
print(f"名前: {name}, 年齢: {age}歳, 都市: {city}")
case (name, age):
print(f"名前: {name}, 年齢: {age}歳(都市情報なし)")
case (name,):
print(f"名前: {name}(情報不足)")
case _:
print("無効なユーザー情報です。")
実行結果:
名前: Alice, 年齢: 30歳, 都市: Tokyo
名前: Bob, 年齢: 25歳(都市情報なし)
名前: Charlie(情報不足)
タプルの要素数に応じて自動的に処理が振り分けられます。if文で書くと条件分岐が複雑になりますが、match/case文なら直感的に読みやすく書けます。
【応用2】辞書(dict)のパターンマッチング
辞書のキーと値を使ったマッチングも可能です。APIレスポンスの処理など、実務でも非常に役立ちます。
def handle_response(response: dict):
match response:
case {"status": 200, "data": data}:
print(f"成功!データ: {data}")
case {"status": 404}:
print("エラー: ページが見つかりません(404)")
case {"status": 500}:
print("エラー: サーバー内部エラー(500)")
case _:
print("不明なレスポンスです")
# テスト
handle_response({"status": 200, "data": "ユーザー一覧"})
handle_response({"status": 404})
handle_response({"status": 500})
実行結果:
成功!データ: ユーザー一覧
エラー: ページが見つかりません(404)
エラー: サーバー内部エラー(500)
辞書パターンでは、指定したキーが存在する場合にのみマッチします。他のキーが存在していても問題ありません。
【応用3】クラスのパターンマッチング
クラスのインスタンスに対してもパターンマッチングが使えます。オブジェクト指向プログラミングと組み合わせると非常に強力です。
from dataclasses import dataclass
@dataclass
class Point:
x: float
y: float
def describe_point(point):
match point:
case Point(x=0, y=0):
print("原点です")
case Point(x=0, y=y):
print(f"Y軸上の点: y={y}")
case Point(x=x, y=0):
print(f"X軸上の点: x={x}")
case Point(x=x, y=y):
print(f"座標: ({x}, {y})")
case _:
print("Pointオブジェクトではありません")
# テスト
describe_point(Point(0, 0))
describe_point(Point(0, 5))
describe_point(Point(3, 0))
describe_point(Point(3, 4))
実行結果:
原点です
Y軸上の点: y=5
X軸上の点: x=3
座標: (3, 4)
dataclassと組み合わせることで、属性の値ごとに処理を切り替えることが非常にシンプルに書けます。
【応用4】ガード条件(if節)を使ったマッチング
caseの後ろに if 条件 を追加することで、パターンに加えて追加条件(ガード)を設定できます。
def classify_number(n):
match n:
case n if n < 0:
print(f"{n} は負の数です")
case 0:
print("ゼロです")
case n if n % 2 == 0:
print(f"{n} は正の偶数です")
case n:
print(f"{n} は正の奇数です")
# テスト
classify_number(-3)
classify_number(0)
classify_number(4)
classify_number(7)
実行結果:
-3 は負の数です
ゼロです
4 は正の偶数です
7 は正の奇数です
ガード条件を使うことで、単純な値の一致だけでなく範囲や計算結果に基づく条件分岐も match/case 文でまとめて表現できます。
【応用5】OR パターン(複数の値をまとめてマッチ)
|(パイプ)を使うことで、複数のパターンをひとつの case にまとめることができます。
def check_day(day: str):
match day:
case "Saturday" | "Sunday":
print(f"{day} は週末です")
case "Monday" | "Tuesday" | "Wednesday" | "Thursday" | "Friday":
print(f"{day} は平日です")
case _:
print("正しい曜日を入力してください")
# テスト
check_day("Saturday")
check_day("Monday")
check_day("Holiday")
実行結果:
Saturday は週末です
Monday は平日です
正しい曜日を入力してください
match/case文 vs if/elif/else:どちらを使うべき?
match/case文と if/elif/else は、用途に応じて使い分けるのがベストです。
| 比較項目 | match/case文 | if/elif/else |
|---|---|---|
| 単純な値の比較 | ✅ 得意 | ✅ 得意 |
| 範囲・計算条件 | △ ガード条件が必要 | ✅ 得意 |
| 構造分解(タプル・辞書) | ✅ 非常に得意 | ❌ 複雑になる |
| クラスのマッチング | ✅ 非常に得意 | ❌ isinstance等が必要 |
| 可読性(分岐が多い場合) | ✅ 高い | △ 長くなりがち |
一般的には、値やデータ構造によって処理を分岐するならmatch/case文、数値の範囲比較や複合的な論理条件ならif/elif/elseが向いています。
match/case文を使う際の注意点
- ✅ Python 3.10以上でのみ使用可能です。
python --versionでバージョンを確認してください。 - ✅
case _:(ワイルドカード)は必ずしも書く必要はありませんが、想定外の値に対する安全のために記述を推奨します。 - ✅ match/case文は上から順に評価され、最初に一致したcaseが実行されます(break不要)。
- ✅ Pythonの match/case はC言語系のswitch/caseと異なり、フォールスルー(次のcaseへの自動移動)はありません。
まとめ:Python match/case文をマスターしよう
この記事では、Python 3.10で導入されたmatch/case文(パターンマッチング)について、基本から応用まで解説しました。
- 📌 リテラルマッチング:値と完全一致で分岐
- 📌 シーケンスパターン:リスト・タプルの構造分解
- 📌 辞書パターン:dictのキー・値でマッチング
- 📌 クラスパターン:インスタンスの属性でマッチング
- 📌 ガード条件:if節で追加条件を付与
- 📌 ORパターン:
|で複数パターンをまとめる
match/case文を使いこなすことで、複雑な条件分岐をシンプルかつ読みやすいコードで表現できるようになります。ぜひ実際のコードで試してみてください!
👉 Pythonのif文・elif・elseについて改めて確認したい方はこちら:PythonでSwitch/Caseを再現する方法【if文活用ガイド】
📚 関連記事
- 【初心者向け】Pythonのif文の基礎と実践例7問— match/case文の前提知識であるif文の基本を理解するのに最適
- 【Python入門】関数(def文)の使い方を完全解説|引数・return・デフォルト値まで— match/case文内での関数呼び出しパターンを学習するのに有用
- Python初心者のためのリストの基礎と実用例3問— シーケンスパターンマッチング(リスト・タプル)の理解に不可欠
- Python初心者のための辞書(dict型)の基礎と実用例3問— 辞書パターンマッチングの実装例を学ぶ際に参考になる





