Python便利テク

【Python 3.10】match/case文とは?使い方・実用例をわかりやすく解説

Python 3.10の新機能!match/case文を超初心者向けにわかりやすく解説【実用例付き】

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入門 第2版 (スッキリわかる入門シリーズ)

もしも

スッキリわかるPython入門 第2版 (スッキリわかる入門シリーズ)

初心者に定番のPython入門書

Amazonで見る
徹底攻略! 電子工作&プログラミング Arduinoで学ぶ電子工作完全ガイド

もしも

徹底攻略! 電子工作&プログラミング Arduinoで学ぶ電子工作完全ガイド

電子工作とプログラミングを同時に学べる

Amazonで見る
Python Web開発実践入門 ―― FastAPIによるWebAPI開発と非同期処理

もしも

Python Web開発実践入門 ―― FastAPIによるWebAPI開発と非同期処理

FastAPIでWebAPI開発を実践的に学ぶ

Amazonで見る

※本記事にはアフィリエイトリンクが含まれます。

ABOUT ME
やまちゃん
これまで学生と社会人を合わせて5000人以上にプログラミング学習を指導。 ゼロからイチをわかりやすく解説する専門家として活動しており、本業ではArduinoを用いたIoT開発とロボットプログラミングが専門。 Pythonを用いたアプリ開発、ウェブアプリケーションの開発で業務の効率化をサポートしています。

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です