ساختار match-case در نسخه 3.10 پایتون معرفی شد و به عنوان شکل توسعه یافته تری از شرط های if-elif-else عمل می کند. این ساختار شبیه به switch-case در زبان های دیگر مانند C یا Java است، اما با قابلیت های بسیار پیشرفته تر که به آن « تطبیق ساختاری» یا Structural Pattern Matching گفته می شود.
مثال ساده:
status = 404
match status:
case 200:
print("Success")
case 404:
print("Not Found")
case 500:
print("Server Error")
case _:
print("Unknown")
تفاوت با if:
- کد
match-caseخواناتر و مرتب تر ازif-elif-elseاست، به خصوص زمانی که چندین مقدار مختلف باید بررسی شوند. - در
match-caseمی توان ساختارهای پیچیده تری مانند لیست، دیکشنری یا آبجکت را نیز تطبیق داد. - در
matchمی توان از الگوهایی مانند باز کردن لیست، بررسی نوع، بررسی مقادیر تو در تو و حتی اتصال متغیر در الگو استفاده کرد.
مثال ۱: تطبیق ساختاری با دیکشنری
user = {"type": "admin", "name": "Sara", "age": 30}
match user:
case {"type": "admin", "name": name, "age": age}:
print(f"Admin: {name}, Age: {age}")
case {"type": "guest", "name": name}:
print(f"Guest: {name}")
case {"type": "user", **rest}:
print(f"User with extra data: {rest}")
case _:
print("Unknown user type")
در این مثال، می توانید مشاهده کنید که چگونه می توان مقادیر خاصی از دیکشنری را استخراج کرد (name و age) و همچنین از **rest برای جمع آوری بقیه مقادیر استفاده کرد.
مثال ۲: تطبیق ساختاری با لیست
command = ["send", "ali", "hello"]
match command:
case ["send", recipient, message]:
print(f"Sending '{message}' to {recipient}")
case ["receive", who]:
print(f"Receiving from {who}")
case ["delete", *items]:
print(f"Deleting {len(items)} items")
case _:
print("Unknown command")
در این مثال، ساختار لیست بررسی می شود. اگر لیست با الگو مطابقت کند، مقادیر آن در متغیرهای مشخص شده ذخیره می شوند. از *items برای تطبیق با تعداد متغیری از عناصر استفاده شده است.
مثال ۳: استفاده از Guard (شرط اضافی)
point = (3, 4)
match point:
case (0, 0):
print("Origin")
case (x, 0) if x > 0:
print(f"Positive X axis: {x}")
case (0, y) if y > 0:
print(f"Positive Y axis: {y}")
case (x, y) if x > 0 and y > 0:
print(f"First quadrant: ({x}, {y})")
case (x, y):
print(f"Other point: ({x}, {y})")
کلمه کلیدی if بعد از الگو، Guard نامیده می شود. این امکان به شما اجازه می دهد شرایط اضافی روی متغیرهای استخراج شده تعیین کنید. اگر شرط Guard برقرار نباشد، به الگوی بعدی رفته می شود.
نکات مهم:
- ساختار
match-caseفقط در پایتون 3.10 و بالاتر قابل استفاده است. - کاراکتر
_به عنوان حالت پیش فرض (مشابهdefaultدر switch) عمل می کند. - الگوها از بالا به پایین بررسی می شوند و اولین الگوی منطبق اجرا می شود.
- متغیرهایی که در الگو تعریف می شوند، فقط در بلاک مربوطه قابل دسترسی هستند.
- Guard ها امکان اضافه کردن شرایط اضافی به الگوها را فراهم می کنند.
امیرحسین عظیمی
17 , تیر , 1405 - 17:49 بعد از ظهریک سوالی ذهنمو درگیر کرده برای چی پایتون این قابلیت هایی که تو زبان های دیگه زودتر اومده رو اضافه نکرده و حالا که به 3.10 رسیده اضافه کرده ؟
علی بیگدلی
17 , تیر , 1405 - 18:05 بعد از ظهرنیازمندی و pythonist بودن