آموزش پایتون - دستور Match-Case

دستور match-case در پایتون

یک دستور match-case در پایتون، یک عبارت (expression) را دریافت کرده و مقدار آن را با الگوهای متوالی که به صورت یک یا چند بلوک case تعریف شده‌اند، مقایسه می‌کند. تنها اولین الگویی که تطبیق داده شود اجرا می‌شود. همچنین امکان استخراج اجزا (عناصر دنباله یا ویژگی‌های شیء) از مقدار، در داخل متغیرها وجود دارد.

با انتشار پایتون ۳.۱۰، تکنیک تطبیق الگو با نام match-case معرفی شد که مشابه ساختار switch-case در زبان‌هایی مانند C/C++/Java و غیره است. کاربرد اصلی آن مقایسه یک متغیر با یک یا چند مقدار است. این ساختار بیشتر به تطبیق الگو در زبان‌هایی مثل Rust یا Haskell شباهت دارد تا دستور switch در C یا ++C.

سنتکس (Syntax)

سنتکس دستور match-case در پایتون به صورت زیر است −

match variable_name:
   case 'pattern 1' : statement 1
   case 'pattern 2' : statement 2
   ...
   case 'pattern n' : statement n

مثال

کد زیر دارای تابعی به نام ()weekday است. این تابع یک آرگومان عددی صحیح دریافت می‌کند، آن را با تمام مقادیر ممکن برای شماره روزهای هفته تطبیق می‌دهد و نام روز مربوطه را برمی‌گرداند.

def weekday(n):
   match n:
      case 0: return "Monday"
      case 1: return "Tuesday"
      case 2: return "Wednesday"
      case 3: return "Thursday"
      case 4: return "Friday"
      case 5: return "Saturday"
      case 6: return "Sunday"
      case _: return "Invalid day number"
print (weekday(3))
print (weekday(6))
print (weekday(7))

با اجرا، این کد خروجی زیر را تولید خواهد کرد −

Thursday
Sunday
Invalid day number

آخرین دستور case در تابع، دارای مقدار "_" برای مقایسه است. این عبارت به عنوان یک حالت عام (wildcard) عمل می‌کند و در صورتی که هیچ‌یک از حالات دیگر برقرار نباشند، اجرا خواهد شد.

ترکیب حالات (Cases) در دستور Match

گاهی اوقات ممکن است شرایطی پیش بیاید که برای بیش از یک حالت، نیاز به انجام یک اقدام مشابه باشد. برای این منظور، می‌توانید حالات مختلف را با عملگر OR که با نماد "|" نشان داده می‌شود، ترکیب کنید.

مثال

کد زیر نحوه ترکیب حالات را در دستور match نشان می‌دهد. این کد تابعی به نام ()access را تعریف می‌کند که یک آرگومان رشته‌ای به عنوان نام کاربر دریافت می‌کند. برای کاربران admin یا manager، سیستم دسترسی کامل اعطا می‌کند؛ برای کاربر Guest، دسترسی محدود است؛ و برای بقیه افراد، هیچ دسترسی وجود ندارد.

def access(user):
   match user:
      case "admin" | "manager": return "Full access"
      case "Guest": return "Limited access"
      case _: return "No access"
print (access("manager"))
print (access("Guest"))
print (access("Ravi"))

با اجرای کد بالا، نتیجه زیر نمایش داده خواهد شد −

Full access
Limited access
No access

لیست به عنوان آرگومان در دستور Match Case

از آنجا که پایتون می‌تواند عبارت را با هر مقدار لیتریالی تطبیق دهد، می‌توانید از یک لیست به عنوان مقدار case استفاده کنید. علاوه بر این، برای تعداد متغیر آیتم‌ها در لیست، می‌توان آن‌ها را با عملگر "*" تجزیه کرده و به یک دنباله تبدیل نمود.

مثال

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

def greeting(details):
   match details:
      case [time, name]:
         return f'Good {time} {name}!'
      case [time, *names]:
         msg=''
         for name in names:
            msg+=f'Good {time} {name}!\n'
         return msg

print (greeting(["Morning", "Ravi"]))
print (greeting(["Afternoon","Guest"]))
print (greeting(["Evening", "Kajal", "Praveen", "Lata"]))

با اجرا، این کد خروجی زیر را تولید خواهد کرد −

Good Morning Ravi!
Good Afternoon Guest!
Good Evening Kajal!
Good Evening Praveen!
Good Evening Lata!

استفاده از "if" در عبارت "Case"

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

مثال

در مثال زیر، آرگومان تابع یک لیست شامل مبلغ (amount) و مدت زمان (duration) است و سود باید برای مبالغ کمتر یا بیشتر از ۱۰۰۰۰ محاسبه شود. این شرط در عبارت case گنجانده شده است.

def intr(details):
   match details:
      case [amt, duration] if amt<10000:
         return amt*10*duration/100
      case [amt, duration] if amt>=10000:
         return amt*15*duration/100
print ("Interest = ", intr([5000,5]))
print ("Interest = ", intr([15000,3]))

با اجرا، این کد خروجی زیر را تولید خواهد کرد −

Interest = 2500.0
Interest = 6750.0

پیشرفت مطالعه: وضعیت خوانده‌شدن این درس فقط در همین مرورگر ذخیره می‌شود؛ بدون نیاز به حساب کاربری.