
عبارات سوئیچینگ مورد پایتون از زمان پایتون 3.10 در اینجا وجود داشته است! این عبارات در واقع عبارات تطبیق مورد نامیده می شوند.
با یک عملگر تطبیق حروف کوچک، میتوانید از شر زنجیرههای if-elif-else نسبتاً پرمخاطب مانند این خلاص شوید:
http_status = 400 if http_status == 400: print("Bad Request") elif http_status == 403: print("Forbidden") elif http_status == 404: print("Not Found") else: print("Other")
در عوض، میتوانید از یک عبارت تطبیق حروف فشرده برای انجام دقیقاً همان کار استفاده کنید:
http_status = 400 match http_status: case 400: print("Bad Request") case 403: print("Forbidden") case 404: print("Not Found") case _: print("Other")
در برخی شرایط، رویکرد دوم بهتر است. این می تواند کد را خواناتر و کمتر تکرار کند. در این راهنما، هر آنچه را که باید در مورد عبارات تطبیق حروف پایتون بدانید، یاد می گیرید.
مشکل اگر-دیگر
در مورد هر زبان برنامه نویسی صحبت می کنیم، عبارات if-else همیشه کارآمدترین راه برای مقایسه نیستند. این زمانی درست است که عبارات if-else تکرار شوند.
برای دیدن یک مثال، بیایید یک اسکریپت شبه کد بنویسیم که روز هفته را با استفاده از عبارات if-else بررسی می کند:
day = "Monday" if day == "Sunday" { print("Take it easy") } else if day == "Monday" { print("Go to work") } else if day == "Tuesday" { print("Work + Hobbies") } else if day == "Wednesday" { print("Meetings") } else if day == "Thursday" { print("Presentations") } else if day == "Friday" { print("Interviews and party") } else if day == "Saturday" { print("Time to do sports") }
در این قسمت از کد تکرار زیادی وجود دارد.
هر کس دیگری – اگر چک تکرار شود روز == “چیزی”. اما واضح است که منظور شما این است day
در هر مقایسه ای بنابراین اگر نیازی به تکرار نداشته باشید عالی خواهد بود روز == “چیزی” در هر مقایسه ای که انجام می دهید
این منجر به یک راه حل منظم به نام دستور سوئیچ کیس می شود. این راه حل معمولا در زبان های برنامه نویسی رایج وجود دارد.
راه حل – بیانیه های سوئیچ موردی
دستور سوئیچ case دستورات if-else را در یک ساختار منطبق با الگو ترکیب می کند.
با استفاده از switch-case، مقدار مورد علاقه خود را مشخص می کنید و الگوها (موردها) را برای هر نتیجه ممکن مشخص می کنید. سپس کد سعی می کند مقدار را با الگوها مطابقت دهد.
استفاده از اپراتور سوئیچ ثبت به شما کمک می کند از تکرار جلوگیری کنید و کد خود را تمیز نگه دارید.
در اینجا یک نمونه شبه کد برای جایگزینی ظروف if-else بالا با یک سوئیچ مورد آورده شده است:
day = "Monday" switch day { case "Sunday" : print("Take it easy") case "Monday" : print("Go to work") case "Tuesday" : print("Work + Hobbies") case "Wednesday": print("Meetings") case "Thursday" : print("Presentations") case "Friday" : print("Interviews and party") case "Saturday" : print("Time to do sports") }
این بسیار تمیزتر به نظر می رسد و بسیار کوتاهتر از آشفتگی if-else که در بخش قبلی دیدید است.
کیس سوئیچ در زبان های برنامه نویسی محبوب مانند C++ دیده می شود.
Python 3.10 همچنین از دستورهای تغییر حروف پشتیبانی می کند. اما آنها نام دیگری دارند – اظهارات تطبیق مورد.
بیایید عمیقتر به عبارات تطبیق حروف در پایتون بپردازیم.
Case Match Statement – نسخه Python Switch Case
نسخه های پایتون 3.10+ شروع به پشتیبانی از عملگر switch-case می کنند. توجه کنید که در پایتون چگونه نامیده می شود یک قوطی کبریتسوئیچ نیست
عبارت match-case به عنوان تطبیق الگوی ساختاری نیز شناخته می شود.
مشکلی که مسابقه حل می کند در فصل قبل توضیح داده شده است. به طور خلاصه، جملات تکراری if-else را با ساختار فشرده ای برای تطبیق الگو جایگزین می کند.
Match Case در پایتون
عملگر تطبیق case از این نحو پیروی می کند:
match element: case pattern1: # statements case pattern2: # statements case pattern3: # statements
اینجا:
- را مورد منطبق به معنی «مطابق با
element
با مدل های زیر” - سپس هر کدام مدل مورد بیانیه مقایسه می کند عنصر با مدل مشخص شده این می تواند برای مثال یک رشته یا یک عدد باشد.
- اگر یک الگو مطابقت دارد عنصر، بلوک کد مربوطه اجرا می شود. سپس عملگر مسابقه خارج می شود.
بگذارید یک مثال به شما نشان دهم. بیایید مثال شبه کد روزهای هفته را که قبلا دیدید با استفاده از پایتون پیاده سازی کنیم. یک رویکرد معمولی if-else به شکل زیر است:
day = "Monday" if day == "Sunday": print("Take it easy") elif day == "Monday": print("Go to work") elif day == "Tuesday": print("Work + Hobbies") elif day == "Wednesday": print("Meetings") elif day == "Thursday": print("Presentations") elif day == "Friday": print("Interviews and party") elif day == "Saturday": print("Time to do sports")
اما با اپراتور Python 3.10 match-case، میتوانید کد را تا حد زیادی تغییر دهید:
day = "Monday" match day: case "Sunday" : print("Take it easy") case "Monday" : print("Go to work") case "Tuesday" : print("Work + Hobbies") case "Wednesday" : print("Meetings") case "Thursday" : print("Presentations") case "Friday" : print("Interviews and party") case "Saturday" : print("Time to do sports")
به هر حال، اگر راحتتر است، میتوانید عبارات حروف بزرگ را نیز شکسته و به چندین خط بسط دهید.
در اینجا کد بالا آمده است، که در آن هر عبارت در یک خط جداگانه قرار دارد:
day = "Monday" match day: case "Sunday": print("Take it easy") case "Monday": print("Go to work") case "Tuesday": print("Work + Hobbies") case "Wednesday": print("Meetings") case "Thursday": print("Presentations") case "Friday": print("Interviews and party") case "Saturday": print("Time to do sports")
اکنون درک اساسی از تطبیق الگوی ساختاری در پایتون دارید.
به طور خلاصه، به جای استفاده از عبارات if-else پرمخاطب و تکراری برای بررسی شرایط، ممکن است بخواهید از عبارات تطبیق حروف استفاده کنید.
بیایید به یادگیری انواع مختلف الگوهایی که میتوانید با استفاده از دستورالعملهای تطبیق حروف با آنها مطابقت دهید، ادامه دهیم.
5 نوع متداول الگوهای تطبیق
انواع مختلفی از مدل ها وجود دارد که می توانید آنها را مطابقت دهید.
قابل توجه ترین آنها عبارتند از:
- مدل های تحت اللفظی
- گرفتن الگوها
- الگوهای وایلدکارد
- مدل های ارزش ثابت
- الگوهای توالی
بیایید به هر یک با جزئیات نگاه کنیم.
مدل 1: مدل های تحت اللفظی
اساسی ترین مورد استفاده برای موارد کبریت تطبیق الگوهای تحت اللفظی است. کلمه ای که می توانید با آن مطابقت دهید می تواند باشد:
- عدد
- یک رشته
- هیچ یک
- درست است، واقعی
- نادرست
یک مثال خوب از تطبیق الگوی تحت اللفظی مثال روز هفته است. در این مثال، ما یک رشته را به معنای واقعی کلمه به یک متغیر متصل می کنیم روز:
day = "Monday" match day: case "Sunday" : print("Take it easy") case "Monday" : print("Go to work") case "Tuesday" : print("Work + Hobbies") case "Wednesday" : print("Meetings") case "Thursday" : print("Presentations") case "Friday" : print("Interviews and party") case "Saturday" : print("Time to do sports")
مدل 2: گرفتن الگوها
شما می توانید از عملگر match-case برای ذخیره (catch) یک مقدار مطابق با یک متغیر استفاده کنید.
این به بهترین شکل با یک مثال نشان داده می شود.
به عنوان مثال، اجازه دهید یک تابع greet() ایجاد کنیم که اگر نامی مشخص شده باشد به یک فرد خوش آمد می گوید.
def greet(name=None): match name: # Check if name == None case None: print("Hello there") # Store name into some_name if it is not None case some_name: print(f"Hello {some_name}") greet() # Prints "Hello there" greet("Jack") # Prints "Hello Jack"
این اپراتور مطابقت دو کار را انجام می دهد (همانطور که در نظرات مشخص شده است):
- بررسی می کند اگر نام است هیچ یک. اگر چنین است، پیام تبریک پیش فرض نمایش داده می شود.
- بررسی می کند اگر نام مطابق با هر چیزی غیر از هیچ یک. اگر اینطور باشد، آن نام در ذخیره می شود some_name. سپس به این نام سلام می شود.
مدل 3: قالب وایلدکارد
هنگام استفاده از حروف مطابقت، میتوانید از یک الگوی عام برای مطابقت بدون صحافی استفاده کنید. این بلوک else عملگر match است.
الگوی عام با مقداری مطابقت دارد که با هیچ حالت دیگری مطابقت ندارد.
برای ایجاد یک الگوی عام، از خط زیر استفاده کنید _.
برای مثال، بیایید نتیجه پرتاب سکه را با هم مقایسه کنیم:
coinflip = 4 match coinflip: case 1: print("Heads") exit() case 0: print("Tails") case _: print("Must be 0 or 1.")
خروجی:
Must be 0 or 1.
در اینجا، مورد عام با هر چیزی مطابقت دارد 0 یا 1.
یکی دیگر از موارد استفاده برای وایلد کارت این است که به ارزش مطابقت اهمیتی نمی دهید. این زمانی مفید است که میخواهید مطمئن شوید که یک مقدار (یا گروهی از مقادیر) وجود دارد، مهم نیست که آن مقدار چقدر است.
برای مثال، بیایید بعد یک تاپل را بررسی کنیم که یک مکان را بدون اهمیت دادن به مقادیر مختصات نشان می دهد:
location = (0, 0) match location: case(_,): print("1D location found") case(_, _): print("2D location found") case(_, _, _): print(("3D location found"))
خروجی:
2D location found
همانطور که می بینید، این مورد مطابقت فقط به تعداد موارد یافت شده اهمیت می دهد.
الگوی 4: الگوها و شمارش هایی با مقادیر ثابت
شما می توانید از عناصر شمارش به عنوان الگو در عملگر تطبیق حروف استفاده کنید.
اگر با شمارش آشنایی ندارید، این مقاله را بررسی کنید.
برای نشان دادن اینکه چگونه می توان از یک عملگر شمارش و تطبیق موارد استفاده کرد:
- بیایید یک را ایجاد کنیم جهت شمارشی که نشان دهنده چهار جهت اصلی در قطب نما است.
- بیایید یک تابع نیز ایجاد کنیم handle_directions() که جهت را به عنوان ورودی می گیرد. این تابع جهت را به یکی از جهات از شمارش ترسیم می کند و بر اساس آن واکنش نشان می دهد.
این هم کد:
from enum import Enum class Direction(Enum): NORTH = 1 EAST = 2 SOUTH = 3 WEST = 4 def handle_directions(direction): match direction: case Direction.NORTH: print("Heading North") case Direction.EAST: print("Heading East") case Direction.SOUTH: print("Heading South") case Direction.WEST: print("Heading West")
اکنون می توانید تماس بگیرید handle_directions() مثل این به عنوان مثال:
handle_directions(Direction.NORTH)
می توانید اسکریپت فوق را با اسکریپت بسیار ساده تری جایگزین کنید. اما نشان می دهد که چگونه می توانید از شمارش و تطبیق استفاده کنید.
دلیل اینکه ممکن است بخواهید این کار را انجام دهید این است که نمی خواهید از رشته های به اصطلاح عرفانی در کد خود استفاده کنید. برای جزئیات بیشتر در مورد معنای این، این مقاله را ببینید.
مدل 5: مدل های دنباله ای
هنگام تطبیق الگوها، می توانید مقادیر توالی را باز کنید.
اگر نمی دانید باز کردن بسته بندی چیست، به این معنی است که مقادیر یک دنباله را به متغیرهای جداگانه بکشید.
به عنوان مثال:
directions = ["North", "East", "South", "West"] # Grab the values from a list and store them into variables n, e, s, w = directions print(n) # prints North print(e) # prints East print(s) # prints South print(w) # prints West
هنگام تطبیق یک الگو می توانید از باز کردن استفاده کنید.
به عنوان مثال، بیایید بررسی کنیم که آیا یک مکان یک نقطه یک بعدی، دو بعدی یا سه بعدی است. علاوه بر این، بیایید مقادیر مختصات را در متغیرهای جداگانه ذخیره کرده و آنها را چاپ کنیم.
location = (1, 3) match location: case x, : print(f"1D location found: ({x})") case x, y: print(f"2D location found: ({x}, {y})") case x, y, z: print((f"3D location found: ({x}, {y}, {z})"))
خروجی:
2D location found: (1, 3)
کد مطابقت دارد محل با مجموعه ای از یک، دو یا سه عنصر. سپس مقادیر مختصات در متغیرهای جداگانه باز می شوند.
اگر مقادیر بیشتری دارید اما به سه مورد اول علاقه دارید، می توانید از عملگر * استفاده کنید. این مربوط به “اقلام باقی مانده” است.
به عنوان مثال، فرض کنید شما یک تاپل دارید محل که نشان دهنده مختصات است. همچنین می تواند موارد اضافی را ذخیره کند. برای گرفتن عناصر اضافی، بیایید استفاده کنیم * اپراتور:
location = (1, 3, 2, "a", "b", "c") match location: case x, : print(f"1D location found: ({x})") case x, y: print(f"2D location found: ({x}, {y})") case x, y, z, *names: print((f"3D location found: ({x}, {y}, {z})")) print(f"Also, there was some extra data: {names}")
خروجی:
3D location found: (1, 3, 2) Also, there was some extra data: ['a', 'b', 'c']
اکنون * نام ها تمام عناصر “باقی مانده” را در آن ثبت می کند محل تاپل – مهم نیست که چقدر عناصر اضافی وجود دارد.
اکنون انواع اصلی قالب هایی را که می توانید مطابقت دهید، می شناسید. در آخر، بیایید به نحوه ترکیب الگوها در عملگر تطبیق حروف نگاه کنیم.
ترکیب الگوها در Match Case
امکان مقایسه الگوها در یک عملگر مطابقت وجود دارد.
برای این کار از منطقی یا عملگر استفاده کنید |. این بررسی می کند که آیا حداقل یک الگو با مقدار مطابقت دارد یا خیر.
برای مثال، بیایید روزها را بر اساس آخر هفته بودن یا نبودن آنها مطابقت دهیم:
day = "Monday" match day: case "Saturday" | "Sunday": print("Weekend") case "Monday" | "Tuesday" | "Wednesday" | "Thursday" | "Friday": print("Work")
خروجی:
Work
نتیجه
در یک زبان برنامه نویسی معمولی، شما می توانید عبارات طولانی if-else را با دستورات جابجایی case-switching تمیزتر جایگزین کنید.
در پایتون 3.10 نیز ویژگی مشابهی منتشر شد. در پایتون به این حالت switch-case نمی گویند، بلکه match-case نامیده می شود.
در اینجا یک مثال از یک اپراتور مسابقه آورده شده است:
http_status = 400 match http_status: case 400: print("Bad Request") case 403: print("Forbidden") case 404: print("Not Found") case _: print("Other")
عملگر match-case یک مقدار را با گروهی از الگوها مطابقت می دهد. در صورت وجود تطابق، قسمت مربوطه از کد اجرا می شود.
Match-case مشابه عبارات if-else عمل می کند. تفاوت اصلی این است که شما نیازی به تکرار نام مورد مقایسه ندارید.
با تشکر برای خواندن. امیدوارم برایتان مفید بوده باشد.
کد نویسی مبارک!