تا به حال فکر کردهاید که آیا جایگزینی برای نوشتن این جملات پیچیده If else در پایتون وجود دارد؟ اگر نمیخواهید چندین عبارت «If» کد شما را به هم بریزد، باید از عبارت Switch استفاده کنید که راهی تمیزتر و سریعتر برای پیاده سازی جریان کنترل در کد شما ارائه میدهد. البته بر خلاف زبانهای برنامه نویسی ++C، جاوا، روبی و سایر زبانهای برنامه نویسی، پایتون دستور switch case را ارائه نمیدهد، اما راهکارهای دیگری برای معادل سازی switch case وجود دارد. همچنین در نسخهی ۳.۱۰ پایتون دستور match case میتواند این کار را انجام دهد. در این قسمت از دوره آموزش رایگان پایتون فنولوژی در این مورد توضیح میدهیم.
کاربرد دستور Switch چیست؟
به طور کلی، سوئیچ یک مکانیسم کنترلی است که مقدار ذخیره شده در یک متغیر را بررسی میکند و دستورات مربوطه را اجرا می کند. عبارت Switch case جریان کنترل را در برنامه شما معرفی میکند و اطمینان میدهد که کد شما توسط چندین عبارت if به هم نریزد. بنابراین، کد شما برای بینندگان دقیق و شفاف به نظر میرسد. این یک ویژگی برنامه نویسی فوق العاده است که برنامه نویسان از آن برای پیاده سازی جریان کنترل در کد خود استفاده میکنند. در این دستور یک متغیر مورد ارزیابی قرار میگیرد(switch)؛ اگر مقدار آن برابر case اول بود، دستورات case 1، اگر برابر case دوم بود، دستورات case 2 و به همین ترتیب تا انتها اجرا میشوند.
نمونه switch case در زبان c
اگر همیشه به زبان هایی مانند C یا Java کد نویسی کردهاید، ممکن است عجیب به نظر برسد که پایتون دستور case ندارد. در عوض پایتون راه حلهای متعددی مانند دیکشنری، کلاسهای پایتون یا توابع lambda پایتون را برای پیاده سازی دستورات switch-case ارائه میدهد. قبل از اینکه به عمق این راهکارها بپردازیم، ابتدا بیایید ببینیم عملکرد یک switch case در سایر زبانهای برنامه نویسی چگونه است. به قطعه کد C زیر دقت کنید:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
// Following is a simple C program // to demonstrate syntax of switch. #include <stdio.h> int main() { int x = 2; switch (x) { case 1: printf("Choice is 1"); break; case 2: printf("Choice is 2"); break; case 3: printf("Choice is 3"); break; default: printf("Choice other than 1, 2 and 3"); break; } return 0; } |
در کد بالا مقدار متغیر x، همان مقداری است که باید روی آن تغییر (switch) اعمال شود. case 1 بررسی میکند آیا مقدار x برابر ۱ است یا خیر؛ به همین ترتیب برای case های دیگر نیز بررسی میکند که در نهایت متوجه میشود مقدار مورد نظر برابر ۲ است و با دستور break خارج میشود.
پیاده سازی switch case در پایتون
برای این کار راههای مختلفی وجود دارد. در پایتون ۳.۱۰ از دستور match case استفاده میکنیم. برای نسخههای قبل از آن روشهای زیر میتوانند استفاده شوند:
- استفاده از دیکشنری در پایتون
- استفاده از کلاسها در پایتون
استفاده از دیکشنری معادل switch case در پایتون
دیکشنری در زبانهای برنامه نویسی، شامل یک کلید (key) و یک مقدار (value) است. اگر از دیکشنری به جای switch case بخواهیم استفاده کنیم، keyها معادل case خواهند بود. برای این کار ابتدا توابعی تعریف میکنیم که با فراخوانی آنها نام یک سال نمایش داده شود. سپس در یک دیکشنری آنها را متناظر اعداد ماه ایجاد میکنیم. در نهایت تابعی مینویسیم که یک عدد در ورودی میگیرد و در دیکشنری به دنبال ماه مورد نظر میگردد. دستور get مقدار key یک دیکشنری به همراه مقدار default را میگیرد و value متاظر را بر میگرداند. اگر آن key در دیکشنری نبود حالت default بر میگرداند. (پیش فرض آن None است و میتوانیم خودمان نیز آن را تعیین کنیم.)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
def january(): return “January” def february(): return “February” def march(): return “march” def april(): return “April” def may(): return “may” def june(): return “June” def july(): return “July” def august(): return “august” def september(): return “September” def october(): return “October” def november(): return “November” def december(): return “December” def default(): return “Incorrect month” switcher = { 0: ‘january’, 1: ‘february’, 2: ‘march’, 3: ‘april’, 4: ‘may’, 5: ‘june’, 6: ‘july’, 7: ‘august’, 8: ‘september’, 9: ‘october’, 10: ‘november’, 11: ‘december’ } def month(monthOfYear): return switcher.get(monthOfYear, default)() print(switch(1)) print(switch(0)) |
مشاهدهی خروجی:
1 2 |
February January |
توجه کنید اگر میخواستیم به صورت غیر بهینه از دستور if و elif استفاده کنیم، کدی شبیه زیر داشتیم:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
month = 'april' if month == 'january': print('january') elif month == 'february': print('february') elif month == 'march': print('march') elif month == 'april': print('april') elif month == 'may': print('may') elif month == 'june': print('june') elif month == 'july': print('july') elif month == 'august': print('august') elif month == 'september': print('september') elif month == 'october': print('october') elif month == 'november': print('november') elif month == 'december': print('december') |
کلاس در پایتون برای انجام switch case
توصیه میشود قبل از مطالعهی این بخش حتما مقالهی مفاهیم شیئگرایی، کلاس در پایتون و تابع lambda در پایتون را مطالعه کنید. برای این کار ابتدا یک متد switch داخل یک کلاس switch در پایتون ایجاد میکنیم که به عنوان ورودی یک ماه از سال را میگیرد و نتیجه را به یک رشته در پایتون تبدیل میکند. در مرحلهی بعدی برای هر case یک تابع جداگانه تعریف میکنیم. در زیر کد نهایی را مشاهده میکنید:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
class PythonSwitch: def month(self, monthOf Year): default = “Incorrect month” return getattr(self, ‘case_’ + str(monthOf Year), lambda: default)() def january(self): return “January” def february(self): return “February” def march(self): return “March” def april(self): return “April” def may(self): return “May” def june(self): return “June” def july(self): return “July” def august(self): return “August” def september(self): return “September” def october(self): return “October” def november(self): return “November” def december(self): return “December” my_switch = PythonSwitch() print (my_switch.month(1)) print (my_switch.month(10)) |
1 |
October |