PyDA Course
📖 درس 8 مبتدئ ⏱ 15 دقيقة ⚡ +10 XP ColabKagglenbviewerBinderDeepnoteGitHub if · elif · else · conditionals · truthiness

If / Elif / Else

فرّع كودك بناءً على الشروط ، أساس اتخاذ القرار في بايثون.

🎯 ماذا ستتعلم:
  • كتابة كتل if/elif/else لتفريع المنطق
  • استخدام عوامل المقارنة والعوامل المنطقية في الشروط
  • فهم القيم الصادقة والكاذبة في بايثون
  • كتابة شروط متداخلة عند الحاجة

من الشرط إلى القرار

الحسابُ يُقيّم، والمقارنةُ تقرّر، لكن البرنامجَ الذي يقيّم فقط يجري خطًّا مستقيمًا من أعلى إلى أسفل. والحياة ليست خطًّا مستقيمًا. الدرجةُ بالأحرف دالةٌ متعددة التعريف: تتغير صيغتُها عند عتباتٍ معينة. في الرياضيات تكتب

grade(s)={As90,Bs80,Cs70,Fوإلّا.\mathrm{grade}(s) = \begin{cases} A & s \geq 90,\\ B & s \geq 80,\\ C & s \geq 70,\\ F & \text{وإلّا}. \end{cases}

وif/elif/else في بايثون هي نسخُ الدالةِ متعددةِ التعريف. كل قطعةٍ تحرس مداها، وتنطلق قطعةٌ واحدةٌ حصرًا.

الشوكة المفردة

أنحف فرعٍ ينفّذ جسمه فقط حين تكون الشرط True:

python
score = 85
if score >= 60:
    print("Passing!")

تبدأ الجملة بـ if ثم الشرط ثم علامةَ النقطتين ، النقطتان هما ما يخبر بايثون أن كتلةً قادمة. كل ما تحته مسافةٌ بادئة ينتمي إلى ذلك الفرع ويُشغَّل فقط إن تحقق الشرط.

الشوكة الثنائية

يلتقط else كلَّ ما لم يصيبه if:

python
score = 45
if score >= 60:
    print("Passing!")
else:
    print("Needs more work")

الفرع الثنائي قسمةٌ للنتائج: الشرط يقسّم فضاء القيم إلى نصفين، وكل حالةٍ تهبط في واحدٍ بالضبط.

الشوكة المتعددة: elif

الدوال متعددة التعريف الحقيقية لها أكثر من قطعتين. يضيف elif ، وهو اختصارٌ لـ «else if» ، شروطًا لاحقةً تُفحص بالترتيب وتتوقف عند أولِ صادقٍ منها:

python
score = 78
if score >= 90:
    grade = "A"
elif score >= 80:
    grade = "B"
elif score >= 70:
    grade = "C"
else:
    grade = "F"
print(grade)  # B

لاحظ الاقتصاد: كل شرطٍ من elif يحتاج حدًّا أدنى فقط، لأن الحالات التي فوقه حُسمت مسبقًا. مع s=85s = 85 تفشل القطعة الأولى وتنجح الثانية ، ولا تُشغَّل الفروع التالية أبدًا. وحده فرعٌ واحدٌ يستطيع الانطلاق، وهذا ما يجعله دالةً حقيقية.

الصدقية: قيمٌ في موقع الشروط

الشرطُ بعد if لا يلزم أن يكون مقارنة. تسأل بايثون: «هل هذه القيمة صادقة أم زائفة؟» ، والجواب موحّد:

python
# كل هذه زائفة (falsy) — تتصرف كـ False في الشرط:
bool(0)       # False
bool(0.0)     # False
bool("")      # False
bool([])      # False
bool(None)    # False

# كلُّ ما سواها صادق (truthy) — يتصرف كـ True:
bool(1)       # True
bool("hello") # True
bool([1, 2])  # True

مجموعة القيم الزائفة صغيرةٌ عمدًا: الصفر، والنص الفارغ، والحاويات الفارغة، وNone. وكلُّ ما سوى ذلك يُعدّ. يشتري ذلك شروطًا مقتضبة تُقرأ كفحصٍ بلغةٍ طبيعية:

python
name = ""
if not name:
    print("Name is empty")

items = [1, 2, 3]
if items:
    print("We have items")

السلسلة الفارغة زائفة، فإذاً not name يساوي True؛ والقائمة غير الفارغة صادقة، فينطلق if items. توفّر على نفسك == "" و!= [] الصريحين ، الفحص هو الفراغ نفسه.

التداخل: حين يعتمد سؤالٌ على سؤال

بعض القرارات متتابعة: أولًا، هل بلغتَ سن الرشد؟ ثم، هل تحمل بطاقةَ هوية؟ هذا تداخل:

python
age = 25
has_id = True

if age >= 21:
    if has_id:
        print("Entry allowed")
    else:
        print("Need ID")
else:
    print("Too young")

التداخلُ يعمل، لكن كل مستوى يضاعف المسارات التي يجب على القارئ أن يمسكها في رأسه. سلاسل elif المسطحة تُقرأ كالدالة متعددة التعريف نفسها؛ ابدأ بها واحتفظ بالتداخل للأسئلة المتعلقة فعلًا.

مثالٌ محلول: المنظِّمُ الحراري

المنظِّمُ الحراريُّ دالةٌ متعددةُ القطعِ بثلاثِ قطعٍ. تنسخُها السلسلةُ مباشرةً:

python
temperature = 22

if temperature <= 10:
    state = "heating"
elif temperature >= 30:
    state = "cooling"
else:
    state = "steady"
print(state)  # steady

يُقرأ كالصيغةِ التي هو. وترتيبُ القطعِ مهمٌّ: يفترضُ كلُّ elif أن ما فوقهُ فشل، فلا يُطلق إلا فرعٌ واحدٌ، ولا يُطبع إلا حالةٌ واحدةٌ.

أخطاء شائعة

  • نسيان النقطتين بعد if أو elif أو else ، فبدونها لا يبدأ الفرع أبدًا.
  • = بدل ==. جملة if score = 60 خطأ قواعدي، عن قصد.
  • الإفراط في التداخل حين تكون سلسلة elif (أو عودةٌ مبكرة) هي ما يوضح شكلَ الدالة من نظرةٍ واحدة.
  • يفوز أولُ True لا الأكثرُ تخصيصًا. في if x > 5: ... elif x > 3: ...، يلجُّ x = 4 الفرعَ الثانيَ فقط إذا كان الأولُ قد فشل فعلًا ، ويقعُ ما دون 3 في else. فترتيبُ القطعِ من الأضيقِ إلى الأوسعِ ما يُبقي الصيغةَ صحيحةً.

🧩 تحديات

🧩 تحدٍّ ، فكّر أولًا ثم أظهر

اكتب classify_temp(temp) ترجع "freezing" تحت 00، و"cold" في [0,15)[0,15)، و"warm" في [15,30)[15,30)، و"hot" من 30 فصاعدًا.

💡 الجواب: سلسلة elif، مستغلًّا أن كل فحصٍ لاحقٍ يفترض أن ما قبله فشل: if temp < 0: return "freezing" elif temp < 15: return "cold" elif temp < 30: return "warm" else: return "hot".

🧩 تحدٍّ ، فكّر أولًا ثم أظهر

مع text = "Hello, World!"، اطبع "uppercase" إذا كان النص كله حروفًا كبيرة، و"lowercase" إذا كان كله صغيرة، و"mixed" وإلّا.

💡 الجواب: if text.isupper(): print("uppercase") elif text.islower(): print("lowercase") else: print("mixed") ، مجموعة الشروط كلُّها تشكّل قسمةً كاملة.

🤔 أسئلة سقراطية

  • لماذا elif دون else if؟ وماذا تصنع بايثون بالكلمتين إذا ظهرتا متجاورتين؟
  • مع s=85s = 85، كم شرطًا تقيّم سلسلة الدرجات قبل الدخول إلى فرع؟ (تلميح: أيُّ قطعةٍ تفشل وأيُّها تنطلق؟)
  • ما الفرق بين if x: وif x is not None:؟ ومتى يهمّ كلٌّ منهما؟

✅ فحص سريع

١. ماذا يطبع هذا؟ x = 0; if x: print("yes") else: print("no")

٢. أيُّ شرطٍ يُفحص أولًا؟ if x > 5: ... elif x > 10: ... elif x > 3: ...

ifelifelseconditionalstruthiness