تحقيق فروع شرطية في بايثون: if‑elif‑else و match‑case

1. المقدمة

Python تحظى بشعبية بين العديد من المبرمجين بفضل بساطتها وبنيتها النحوية البديهية، لكن قد يتفاجأ البعض بغياب بنية «switch-case» الموجودة في لغات أخرى. لذلك، في Python يجب استخدام «if-elif-else» أو «القاموس (dictionary)» لتحقيق نفس المعالجة. في هذه المقالة، سنشرح خطوة بخطوة أساليب التفرع الشرطي التقليدية في Python، والبدائل باستخدام القاموس، وكذلك جملة «match-case» الجديدة التي تم تقديمها في Python 3.10. سيمكنك ذلك من إتقان طرق التفرع الشرطي الفعّالة في Python وتطبيقها في الترميز الفعلي.

2. السبب في عدم وجود جملة switch في بايثون

السبب في عدم اعتماد جملة switch-case في بايثون هو بساطتها وقابليتها للقراءة. سعى مصممو بايثون إلى جعل اللغة مختصرة قدر الإمكان وإزالة التكرار والبنى الزائدة. جملة switch مفيدة في لغات أخرى، لكن في بايثون يمكن تحقيق نفس الوظيفة باستخدام جمل “if-elif-else” أو القواميس، لذا لا يُنظر إلى ضرورة إضافة جملة switch. في الواقع، توضح الوثائق الرسمية لبايثون أنه يمكن تغطية وظائف جملة switch باستخدام جمل if-elif-else. الكود التالي هو مثال على جملة switch في لغة C وغيرها.
switch (value) {
  case 1:
    printf("Value is 1");
    break;
  case 2:
    printf("Value is 2");
    break;
  default:
    printf("Other value");
}
في بايثون، يمكن تحويله إلى الشكل التالي.
value = 1
if value == 1:
    print("Value is 1")
elif value == 2:
    print("Value is 2")
else:
    print("Other value")
بهذه الطريقة، يمكن لبايثون تنفيذ الفروع الشرطية بسهولة دون الحاجة إلى جملة switch.
侍エンジニア塾

3. مثال على استخدام if-elif-else

الطريقة الأساسية لإجراء الفروع الشرطية في بايثون هي جملة «if-elif-else». إنها فعّالة جدًا عند تنفيذ عمليات مختلفة بناءً على عدة شروط. فيما يلي مثال نموذجي على استخدامها.
value = 100
if value < 50:
    print("القيمة صغيرة")
elif value < 100:
    print("قيمة متوسطة")
else:
    print("قيمة كبيرة")
في هذا الكود، يتم طباعة رسائل مختلفة بناءً على قيمة المتغير value. جملة if-elif-else تتيح فروعًا شرطية بسيطة وبديهية.

مشكلات عند زيادة عدد الشروط

ومع ذلك، عندما يصبح تعمق جملة if-elif-else عميقًا، قد يصبح الكود صعب القراءة. خاصةً عند التعامل مع شروط معقدة، تكون الطريقة التي تستخدم «القواميس» والتي ستُعرض لاحقًا فعّالة.

4. الفروع الشرطية باستخدام القاموس (dictionary)

باستخدام القاموس في بايثون، يمكنك تنفيذ فروع شرطية تشبه جملة switch-case. القاموس هو بنية بيانات تخزن أزواج المفتاح والقيمة، ويمكنه تمثيل فروع شرطية متعددة بشكل مختصر. في المثال التالي، يتم عرض النتيجة المقابلة بناءً على الرقم الذي يدخله المستخدم.
numbers = {1: "واحد", 2: "اثنان", 3 "ثلاثة"}
value = int(input("الرجاء إدخال عدد من 1 إلى 3: "))

if value in numbers:
    print(f"العدد المختار: {numbers[value]}")
else:
    print("الرجاء إدخال عدد من 1 إلى 3")
بهذه الطريقة، باستخدام القاموس، يمكنك الحفاظ على قصر الكود وسهولة قراءته حتى عندما تكون هناك العديد من الشروط.

مزايا القاموس

الفروع الشرطية باستخدام القاموس تحتفظ بقراءة عالية للكود وسهولة الصيانة حتى عندما تزداد الشروط، وهذا يعتبر ميزة كبيرة. خاصةً عندما يكون هناك عدة عمليات على القيم، تكون أكثر كفاءة من جملة if-elif-else.
年収訴求

5. الميزة الجديدة في Python 3.10: إدخال جملة match-case

جملة “match-case” التي تم تقديمها منذ Python 3.10 هي بنية شبيهة جدًا بجملة switch-case، وتسمح بكتابة عدة شروط بشكل مختصر. هذه الميزة الجديدة قوية بشكل خاص في مطابقة الأنماط، وتُحسّن بشكل كبير قابلية قراءة الكود وصيانته مقارنةً بالطرق التقليدية باستخدام جمل if-elif-else أو القواميس.

البنية الأساسية لـ match-case

فيما يلي مثال أساسي لاستخدام جملة match-case.
def check_value(value):
    match value:
        case 1:
            print("تم اختيار الواحد")
        case 2:
            print("تم اختيار الاثنين")
        case _:
            print("تم اختيار شيء غير 1 أو 2")
في هذا الكود، يتم تنفيذ معالجة مختلفة بناءً على قيمة المتغير value. يُعتبر case _ معالجة افتراضية تُنفّذ عندما لا يتطابق أي من الشروط.

6. أمثلة على تطبيق match-case

عبارة match-case مناسبة للتفرعات الشرطية المعقدة وتطابق الأنماط. على سبيل المثال، يمكن تنفيذ عمليات بناءً على عدد عناصر القائمة أو نوع البيانات.

عبارة match-case التي تدعم شروط متعددة

def process_data(data):
    match data:
        case [x, y]:
            print(f"القائمة تحتوي على عنصرين: {x}, {y}")
        case [x, y, z]:
            print(f"القائمة تحتوي على ثلاثة عناصر: {x}, {y}, {z}")
        case _:
            print("عدد عناصر القائمة مختلف")
في هذا المثال، يتم تنفيذ عمليات مختلفة بناءً على عدد عناصر القائمة. تتميز عبارة match-case بأنها تسمح بكتابة شروط وأنماط بطريقة بسيطة.

7. مقارنة بين if-elif-else، القاموس، و match-case

كل طريقة من طرق التفريع الشرطي لها مزايا وعيوب خاصة بها. أدناه جدول المقارنة.
الطريقةالمزاياالعيوب
if-elif-elseبسيطة وبديهيةعند وجود شروط كثيرة يصبح الكود معقدًا
القاموس (dictionary)قابلة للقراءة العالية وتكون فعّالة عندما تكون الشروط كثيرةليس كل الشرط يمكن تمثيله في القاموس
match-caseفعّالة لتعدد الفروع الشرطية ومطابقة الأنماطمتاحة فقط بدءًا من Python 3.10
يساعدك جدول المقارنة هذا على اختيار الطريقة الأنسب للتفريع الشرطي. خاصةً، جملة match-case مناسبة جدًا للمطابقة المعقدة للأنماط، وتتيح تجنب الإطناب في جمل if-elif-else.

8. الملخص

في بايثون لا توجد جملة switch-case، لكن باستخدام جمل if-elif-else، القواميس، وكذلك جملة match-case في Python 3.10 يمكن تحقيق تقسيم شرطى فعال. خصوصًا جملة match-case قوية في مطابقة الأنماط، وتسمح بكتابة تقسيمات شرطية معقدة بشكل بسيط، لذا ستظل مفيدة في التطوير المستقبلي. من خلال اختيار الطريقة المناسبة حسب الشرط، يمكنك إنشاء كود فعال وسهل القراءة. بهذه الطريقة، من خلال تعميق فهم كل طريقة، يمكنك اختيار النهج الأمثل وفقًا لمتطلبات المشروع الفعلي.