تطبیق الگو در پایتون ۳.۱۰

شکل ۱. تطبیق الگو
شکل ۱. تطبیق الگو
منتشر‌شده در: towardsdatascience به تاریخ ۱۱ ژوئن ۲۰۲۱
لینک منبع Pattern Matching in Python 3.10

پایتون ۳.۱۰ شرح سوئیچ را اجرا کرده‌است. عبارت کلید در زبان‌های دیگر مانندC یا جاوا یک تطابق مقدار ساده روی یک متغیر انجام می‌دهد و بسته به آن مقدار کد را اجرا می‌کند.

می‌توان از آن به عنوان یک عبارت ساده از سوئیچ استفاده کرد اما قابلیت بسیار بیشتری دارد.

این ممکن است برای C به اندازه کافی خوب باشد، اما این پایتون است، و پایتون ۳.۱۰ یک ساختار بسیار قوی‌تر و انعطاف‌پذیرتر به نام تطبیق الگوی ساختاری را اجرا می‌کند. می‌توان از آن به عنوان یک عبارت ساده از سوئیچ استفاده کرد اما قابلیت بسیار بیشتری دارد.

بیایید یک مورد مشکل ساده را در نظر بگیریم. در زیر یک کد نوشته شده‌است که یک سوئیچ را بر روی یک مقدار واحد انجام می‌دهد. ما آن را با اجرای آن در یک حلقه با مقادیر ۱، ۲، ۳ و ۴ تست می‌کنیم.

for thing in [1,2,3,4]:
match thing:
case 1:
print("thing is 1")
case 2:
print("thing is 2")
case 3:
print("thing is 3")
case _:
print("thing is not 1, 2 or 3")

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

این مورد مشابه حالت switch/case در زبان‌های دیگر نیست اما بر خلافC، برای مثال، پس از اینکه کد برای یک مورد خاص اجرا شد، کنترل به انتهای عبارت match می‌پرد.

اگر هیچ تناقضی صورت نگیرد، کد در حالت پیش‌فرض، تعیین‌شده توسط - ، اجرا می‌شود.

و این نتیجه است.

thing is 1
thing is 2
thing is 3
thing is not 1, 2 or 3

جای تعجب نیست.

عبارتswitch یک مورد ساده از تطبیق الگو است اما پایتون آن را کمی جلوتر می برد. نگاهی به این کد بیاندازید:

for thing in [[1,2],[9,10],[1,2,3],[1],[0,0,0,0,0]]:
match thing:
case [x]:
print(f"single value: {x}")
case [x,y]:
print(f"two values: {x} and {y}")
case [x,y,z]:
print(f"three values: {x}, {y} and {z}")
case _:
print("too many values")

این یک جمله match در یک حلقه است، اما این بار لیستی از مقادیر تکرار شونده توسط حلقه، خود لیست هستند-اولی [1,2] سپس [9,10]و غیره.

عبارات پرونده با آن لیست ها مطابقت دارد. مورد اول با یک لیست با یک عنصر مطابقت دارد، مورد دوم با یک لیست با دو عنصر مطابقت دارد، مورد سوم، یک لیست با سه عنصر. آخرین مورد پیش‌فرض است.

اما بیشتر از این کار می‌کند. همچنین به ارزش‌هایی که با شناسه‌ها در عبارت case مطابقت دارند، متصل می‌شود. بنابراین، برای مثال، لیست اول [1,2] است و این با مورد دوم [x,y] مطابقت دارد. بنابراین، در کدی که اجرا می‌شود شناسه‌های x و y به ترتیب مقادیر ۱ و ۲ را می‌گیرند. چه خوب، ها!

بنابراین، نتیجه این است:

two values: 1 and 2
two values: 9 and 10
three values: 1, 2 and 3
single value: 1
too many values

ما از اولین برنامه ساده می‌دانیم که می‌توانیم ارزش‌ها را تطبیق دهیم و از برنامه بالا می‌توانیم الگوهای کلی‌تری را تطبیق دهیم. پس آیا ما می‌توانیم الگوهایی که شامل ارزش‌ها هستند را تطبیق دهیم؟ البته!

for thing in [[1,2],[9,10],[3,4],[1,2,3],[1],[0,0,0,0,0]]:
match thing:
case [x]:
print(f"single value: {x}")
case [1,y]:
print(f"two values: 1 and {y}")
case [x,10]:
print(f"two values: {x} and 10")
case [x,y]:
print(f"two values: {x} and {y}")
case [x,y,z]:
print(f"three values: {x}, {y} and {z}")
case _:
print("too many values")

شما می‌توانید ببینید، برای مثال، در مورد دوم ما با یک لیست که دارای دو عنصر است، مطابقت داریم، که اولی دارای ارزش ۱ است.

نتیجه این است:

two values: 1 and 2
two values: 9 and 10
two values: 3 and 4
three values: 1, 2 and 3
single value: 1
too many values

اما چیزهای بیشتری هم هست.

در اینجا برنامه‌ای ارائه شده‌است که با هر تعداد از عناصر با یک لیست مطابقت دارد.

for thing in [[1,2,3,4],['a','b','c'],"this won't be matched"]:
match thing:
case [*y]:
for i in y:
print(i)
case _:
print("unknown")

در مورد اول، شناسه شروع می‌شود که به این معنی است که یک لیست کامل می‌تواند به آن محدود شود و همانطور که می‌بینیم، می‌تواند در یک حلقه تکرار شود.

1
2
3
4
a
b
c
unknown

اما امیدوارم این مقاله طعم تطبیق الگوی ساختاری را در پایتون ۳.۱۰ به شما داده باشد.

شرح کاملی از تطبیق الگوی ساختاری در وب سایت Python.org، از جمله یک برنامه آموزشی، در PEP 636 وجود دارد. این برنامه آموزشی بسیار خوب است و من شما را تشویق می‌کنم که آن را بخوانید.

علاوه بر تطبیق الگوی ساختاری، پیشرفت‌های بسیار کمی در پایتون ۳.۱۰ وجود دارد. برای مثال، چندین مقاله آن‌ها را توضیح می‌دهند، به ویژگی‌های جدید جیمز بریگز در پایتون ۳.۱۰ مراجعه کنید.

آگاه باشید، که ۳.۱۰ هنوز هم تنها یک نسخه بتا است و در حالی که نمونه‌هایی که من در بالا نشان دادم به خوبی کار می‌کنند، شما نباید تا زمانی که نسخه رسمی آن منتشر نشده است از پایتون ۳.۱۰ با عصبانیت استفاده کنید.

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