🎯 جملة Match في بايثون: ثورة في كتابة الشروط!

إذا كنت قد استخدمت جمل if-elif-else الطويلة والمتكررة من قبل، فاستعد لتتعرف على بديل أنيق وأكثر قوة: جملة match! تُعرف هذه الجملة أيضاً باسم "المطابقة الهيكلية" (Structural Pattern Matching)، وهي ميزة رائعة أضيفت إلى بايثون في الإصدار 3.10 لتجعل كتابة الشروط المتعددة أسهل وأوضح.

في هذا الدرس، سنتعلم كيف نستخدم match و case لتبسيط الكود وتحسين قراءته. هيا بنا! 💻


🤔 ما هي جملة Match ولماذا نحتاجها؟

قبل ظهور match، كنا نعتمد كلياً على if-elif-else للتعامل مع الشروط المتعددة. تخيل أن لديك متغيراً وتريد التحقق من قيمته ضد عدة احتمالات:

# الطريقة التقليدية باستخدام if-elif-else
status = 404

if status == 200:
    message = "OK"
elif status == 404:
    message = "Not Found"
elif status == 500:
    message = "Server Error"
else:
    message = "Unknown Status"

print(message)  # الناتج: Not Found

هذا الكود يعمل بشكل صحيح، ولكن مع زيادة عدد الحالات (elif)، يصبح طويلاً ومتكرراً. هنا يأتي دور match لتنظيم الكود بشكل أفضل!

جملة match تسمح لك بمطابقة قيمة معينة ضد مجموعة من الأنماط (Patterns) وتنفيذ الكود المناسب لأول نمط يتطابق. إنها تشبه فكرة جملة switch في لغات برمجة أخرى، ولكنها أكثر مرونة وقوة.


📝 البنية الأساسية لجملة Match

تركيب جملة match بسيط وواضح. إليك الشكل العام لها:

match [القيمة_التي_نريد_مطابقتها]:
    case [النمط_الأول]:
        # الكود الذي ينفذ إذا تطابق النمط الأول
    case [النمط_الثاني]:
        # الكود الذي ينفذ إذا تطابق النمط الثاني
    case _:
        # الكود الذي ينفذ إذا لم يتطابق مع أي نمط سابق (اختياري)

مكونات الجملة:

  1. match: الكلمة المفتاحية لبدء جملة المطابقة.
  2. القيمة: التعبير أو المتغير الذي نريد فحص قيمته.
  3. case: الكلمة المفتاحية لتعريف نمط (شرط) محدد للمطابقة.
  4. النمط (_) : النمط _ يسمى النمط العام (Wildcard Pattern)، وهو يطابق أي شيء. يستخدم كحالة افتراضية (مثل else).

🔍 أمثلة عملية على استخدام Match

لنطبق ما تعلمناه بأمثلة بسيطة وواضحة.

المثال 1: مطابقة قيم بسيطة

هذا أبسط استخدام لـ match، حيث نطابق القيمة مباشرة.

# اختيار لغة البرمجة المفضلة
fav_language = "Python"

match fav_language:
    case "Python":
        print("أهلاً بمطور بايثون! 🐍")  # هذا ما سيتم طباعته
    case "JavaScript":
        print("أهلاً بمطور جافاسكريبت! 🌐")
    case "Java":
        print("أهلاً بمطور جافا! ☕")
    case _:
        print("لغة رائعة! 👍")

# الناتج: أهلاً بمطور بايثون! 🐍

المثال 2: استخدام النمط العام _

النمط _ يلتقط جميع الحالات التي لم يتم التعامل معها في case سابقة.

# تقييم درجة الطالب
grade = "B"

match grade:
    case "A":
        print("ممتاز! 🌟")
    case "B":
        print("جيد جداً! 👍")  # هذا ما سيتم طباعته
    case "C":
        print("جيد.")
    case _:
        print("يحتاج إلى تحسين.")

# الناتج: جيد جداً! 👍

جرب بنفسك: ماذا يحدث إذا غيرت قيمة grade إلى "F"؟ سيتم تطبيق الحالة الافتراضية case _ وستطبع "يحتاج إلى تحسين."


⚡ ميزات متقدمة بسيطة (في نطاق الدرس)

جملة match لا تقتصر على مطابقة القيم الثابتة البسيطة. دعنا نلقي نظرة على ميزتين بسيطتين وقويتين.

1. مطابقة عدة قيم في Case واحدة

يمكنك استخدام | (الذي يعني "أو") لمطابقة قيمة واحدة ضد عدة احتمالات في سطر case واحد.

# التحقق من حالة الطلب
order_status = "shipped"

match order_status:
    case "pending" | "processing":
        print("⏳ جارٍ معالجة طلبك...")
    case "shipped":
        print("🚚 تم شحن طلبك!")  # هذا ما سيتم طباعته
    case "delivered":
        print("✅ تم التسليم!")
    case _:
        print("حالة غير معروفة.")

# الناتج: 🚚 تم شحن طلبك!

2. ربط القيمة بمتغير عند المطابقة

هذه ميزة رائعة! يمكنك ربط القيمة المطابقة بمتغير جديد داخل case لاستخدامها لاحقاً.

# تحليل إدخال المستخدم
user_input = "say_hello"

match user_input:
    case "say_hello":
        greeting = "مرحباً بالعالم!"
        print(greeting)  # الناتج: مرحباً بالعالم!
    case "say_bye":
        farewell = "مع السلامة!"
        print(farewell)
    case other:  # 'other' أصبح متغيراً يحتوي على القيمة المدخلة
        print(f"الأمر '{other}' غير معروف.")

# في حالة `case other:`، تم ربط القيمة `user_input` بالمتغير `other`.

🆚 Match مقابل If-Elif-Else: أيهما تختار؟

الميزة جملة match سلسلة if-elif-else
القراءة ⭐⭐⭐⭐⭐ أنيقة ومنظمة جداً عند مطابقة قيمة واحدة ضد حالات كثيرة. ⭐⭐⭐ جيدة للحالات البسيطة، ولكنها تصبح فوضوية مع زيادة الشروط.
البساطة ⭐⭐⭐⭐ تركيبها مباشر لمهمة المطابقة هذه. ⭐⭐⭐⭐ بسيطة ومفهومة للجميع.
المرونة ⭐⭐⭐⭐ تدعم مطابقة أنماط معقدة (كما سنرى في دروس متقدمة). ⭐⭐⭐⭐⭐ الأكثر مرونة للشروط المعقدة غير الخطية.

خلاصة: استخدم match عندما يكون لديك متغير واحد تريد التحقق من قيمته ضد عدة احتمالات ثابتة أو أنماط. استخدم if-elif-else للشروط الأكثر تعقيداً أو عند مقارنة متغيرات مختلفة.


🧪 تمارين تطبيقية صغيرة

  1. حول الكود التالي من if-elif-else إلى match:
command = "stop"
if command == "start":
    print("المحرك يعمل...")
elif command == "stop":
    print("المحرك متوقف.")
elif command == "pause":
    print("المحرك متوقف مؤقتاً.")
else:
    print("أمر غير صالح.")
  1. اكتب برنامجاً باستخدام match يأخذ رقم يوم في الأسبوع (من 1 إلى 7) ويطبع اسم اليوم. استخدم _ للحالة الافتراضية إذا كان الرقم خارج النطاق.

(الحلول في نهاية الدرس)


💡 ملخص الدرس

رائع! لقد تعلمت اليوم أداة جديدة قوية في بايثون:

  • جملة match / case هي بديل أنيق لـ if-elif-else عند مطابقة قيمة واحدة.
  • التركيب الأساسي: نبدأ بـ match متبوعة بالقيمة، ثم نعدد حالات case.
  • النمط _ هو النمط العام الذي يطابق أي شيء ويستخدم كحالة افتراضية.
  • يمكنك مطابقة عدة قيم في case واحدة باستخدام | (أو).
  • يمكنك ربط القيمة المطابقة بمتغير داخل case لاستخدامها.
  • match ممتازة لتحسين قراءة الكود عندما تكون الشروط خطية ومتعلقة بقيمة واحدة.