If / Elif / Else
فرّع كودك بناءً على الشروط ، أساس اتخاذ القرار في بايثون.
- كتابة كتل if/elif/else لتفريع المنطق
- استخدام عوامل المقارنة والعوامل المنطقية في الشروط
- فهم القيم الصادقة والكاذبة في بايثون
- كتابة شروط متداخلة عند الحاجة
من الشرط إلى القرار
الحسابُ يُقيّم، والمقارنةُ تقرّر، لكن البرنامجَ الذي يقيّم فقط يجري خطًّا مستقيمًا من أعلى إلى أسفل. والحياة ليست خطًّا مستقيمًا. الدرجةُ بالأحرف دالةٌ متعددة التعريف: تتغير صيغتُها عند عتباتٍ معينة. في الرياضيات تكتب
وif/elif/else في بايثون هي نسخُ الدالةِ متعددةِ التعريف. كل قطعةٍ تحرس مداها، وتنطلق قطعةٌ واحدةٌ حصرًا.
الشوكة المفردة
أنحف فرعٍ ينفّذ جسمه فقط حين تكون الشرط True:
score = 85
if score >= 60:
print("Passing!")تبدأ الجملة بـ if ثم الشرط ثم علامةَ النقطتين ، النقطتان هما ما يخبر بايثون أن كتلةً قادمة. كل ما تحته مسافةٌ بادئة ينتمي إلى ذلك الفرع ويُشغَّل فقط إن تحقق الشرط.
الشوكة الثنائية
يلتقط else كلَّ ما لم يصيبه if:
score = 45
if score >= 60:
print("Passing!")
else:
print("Needs more work")الفرع الثنائي قسمةٌ للنتائج: الشرط يقسّم فضاء القيم إلى نصفين، وكل حالةٍ تهبط في واحدٍ بالضبط.
الشوكة المتعددة: elif
الدوال متعددة التعريف الحقيقية لها أكثر من قطعتين. يضيف elif ، وهو اختصارٌ لـ «else if» ، شروطًا لاحقةً تُفحص بالترتيب وتتوقف عند أولِ صادقٍ منها:
score = 78
if score >= 90:
grade = "A"
elif score >= 80:
grade = "B"
elif score >= 70:
grade = "C"
else:
grade = "F"
print(grade) # Bلاحظ الاقتصاد: كل شرطٍ من elif يحتاج حدًّا أدنى فقط، لأن الحالات التي فوقه حُسمت مسبقًا. مع تفشل القطعة الأولى وتنجح الثانية ، ولا تُشغَّل الفروع التالية أبدًا. وحده فرعٌ واحدٌ يستطيع الانطلاق، وهذا ما يجعله دالةً حقيقية.
الصدقية: قيمٌ في موقع الشروط
الشرطُ بعد if لا يلزم أن يكون مقارنة. تسأل بايثون: «هل هذه القيمة صادقة أم زائفة؟» ، والجواب موحّد:
# كل هذه زائفة (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. وكلُّ ما سوى ذلك يُعدّ. يشتري ذلك شروطًا مقتضبة تُقرأ كفحصٍ بلغةٍ طبيعية:
name = ""
if not name:
print("Name is empty")
items = [1, 2, 3]
if items:
print("We have items")السلسلة الفارغة زائفة، فإذاً not name يساوي True؛ والقائمة غير الفارغة صادقة، فينطلق if items. توفّر على نفسك == "" و!= [] الصريحين ، الفحص هو الفراغ نفسه.
التداخل: حين يعتمد سؤالٌ على سؤال
بعض القرارات متتابعة: أولًا، هل بلغتَ سن الرشد؟ ثم، هل تحمل بطاقةَ هوية؟ هذا تداخل:
age = 25
has_id = True
if age >= 21:
if has_id:
print("Entry allowed")
else:
print("Need ID")
else:
print("Too young")التداخلُ يعمل، لكن كل مستوى يضاعف المسارات التي يجب على القارئ أن يمسكها في رأسه. سلاسل elif المسطحة تُقرأ كالدالة متعددة التعريف نفسها؛ ابدأ بها واحتفظ بالتداخل للأسئلة المتعلقة فعلًا.
مثالٌ محلول: المنظِّمُ الحراري
المنظِّمُ الحراريُّ دالةٌ متعددةُ القطعِ بثلاثِ قطعٍ. تنسخُها السلسلةُ مباشرةً:
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" تحت ، و"cold" في ، و"warm" في ، و"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؟ وماذا تصنع بايثون بالكلمتين إذا ظهرتا متجاورتين؟ - مع ، كم شرطًا تقيّم سلسلة الدرجات قبل الدخول إلى فرع؟ (تلميح: أيُّ قطعةٍ تفشل وأيُّها تنطلق؟)
- ما الفرق بين
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: ...