خانه / آموزش‌ها / آموزش Pattern Matching (Match-Case) در پایتون

آموزش Pattern Matching (Match-Case) در پایتون

🐍 HomeOfPython
|
📅 1404/10/19

سطح مقدماتی (Beginner Level)

مبحث Pattern Matching (تطبیق الگو) که با دستورات match و case در نسخه ۳.۱۰ به پایتون اضافه شد، اغلب به عنوان جایگزینی برای switch-case در زبان‌های دیگر شناخته می‌شود. اما این ویژگی بسیار قدرتمندتر از یک شرط ساده است و به شما اجازه می‌دهد ساختار داده‌ها را بررسی و مقادیر را استخراج کنید.

مفهوم اول: ساختار پایه (Basic Match)

در ساده‌ترین حالت، match یک مقدار را می‌گیرد و آن را با چندین الگوی case مقایسه می‌کند. اگر تطابق پیدا شود، کد مربوطه اجرا می‌شود.

نکته: برای استفاده از این قابلیت باید پایتون ۳.۱۰ یا بالاتر داشته باشید.

Python
python
# Example 2: String Matching (Snippet)
command = "start"

match command:
    case "start":
        start_engine()
    case "stop":
        stop_engine()
    case _:
        print("Invalid command")

مفهوم دوم: استفاده از عملگر OR (|)

شما می‌توانید چندین الگو را در یک خط case با استفاده از کاراکتر | (پایپ) ترکیب کنید. این کار باعث می‌شود اگر متغیر با هر یک از مقادیر برابر بود، کد اجرا شود.

Python
Python

مفهوم سوم: مقدار پیش‌فرض (Wildcard)

در ساختار match-case، علامت _ (Underscore) نقش Wildcard را بازی می‌کند. این الگو همیشه "Match" می‌شود و معادل else در دستورات شرطی است. اگر هیچکدام از caseهای قبلی تطابق نداشتند، این بخش اجرا می‌شود.

Python
python
# Example 2: Logical Flow (Snippet)
# Always place the wildcard at the end
match value:
    case 1:
        pass
    case _:
        print("This catches everything else")

سطح پیشرفته (Professional Level)

قدرت واقعی Pattern Matching زمانی مشخص می‌شود که بخواهید ساختارهای پیچیده داده (مانند لیست‌ها، دیکشنری‌ها یا آبجکت‌ها) را "Deconstruct" (تجزیه) کنید و همزمان شروط منطقی (Guard Clauses) روی آن‌ها اعمال کنید.

الگوهای ترتیبی و استخراج مقدار (Sequence Patterns & Binding)

شما می‌توانید لیست‌ها یا تاپل‌ها را بر اساس ساختارشان تطبیق دهید و مقادیر درون آن‌ها را مستقیماً به متغیرها نسبت دهید (Bind کنید).

Python
python
# Example 2: Coordinates Unpacking (Snippet)
point = (0, 10)

match point:
    case (0, 0):
        print("Origin")
    case (0, y):
        print(f"Y-axis at {y}")
    case (x, 0):
        print(f"X-axis at {x}")
    case (x, y):
        print(f"Point at {x}, {y}")

شرط‌های محافظ (Guard Clauses)

گاهی اوقات تطبیق ساختار کافی نیست و نیاز دارید یک شرط if اضافی را درون case بررسی کنید. به این ویژگی Guard Clause می‌گویند.

Python
Python

تطبیق دیکشنری و آبجکت‌ها (Dictionary & Class Matching)

این بخش برای کدهای حرفه‌ای بسیار حیاتی است. شما می‌توانید وجود کلیدهای خاص در دیکشنری یا اتریبیوت‌های خاص در کلاس‌ها را بررسی کنید.

1. دیکشنری‌ها (Mapping Patterns)

در تطبیق دیکشنری، پایتون فقط کلیدهای ذکر شده را بررسی می‌کند (کلیدهای اضافی نادیده گرفته می‌شوند).

Python

2. کلاس‌ها (Class Patterns)

برای تطبیق روی کلاس‌ها، می‌توانید از نام کلاس و آرگومان‌های آن استفاده کنید.

Python
python
# Example 3: Positional vs Keyword Arguments (Snippet)
# If __match_args__ is defined in the class, you can use positional matching:
# case Point(0, y) instead of case Point(x=0, y=y)
class Point:
    __match_args__ = ("x", "y")
    def __init__(self, x, y):
        self.x = x
        self.y = y

نکات عملکردی و Best Practices

  1. اولویت: پایتون caseها را از بالا به پایین بررسی می‌کند. همیشه الگوهای خاص‌تر (Specific) را بالاتر و الگوهای کلی (General/Wildcard) را در انتها قرار دهید.
  2. عدم دسترسی به متغیرها: در Guard Clauseها (if inside case)، اگر متغیری تعریف نشده باشد، خطا دریافت می‌کنید. مطمئن شوید متغیر در الگوی case بایند شده است.
  3. سرعت: پیاده‌سازی match-case در پایتون برای خوانایی و مدیریت ساختارهای پیچیده بهینه شده است، اما لزوماً سریع‌تر از یک زنجیره ساده if-elif-else نیست (مگر در حالت‌های بسیار پیچیده). از آن برای تمیزی کد استفاده کنید، نه صرفاً سرعت.
Python