اتخاذ القرارات — if و elif و else
سلوك مسارات مختلفة بناءً على الشروط، لماذا يُعد التنسيق والمسافات البادئة ذا معنى في بايثون، والخطأ الخفي الذي يحدث عند ترتيب الشروط بشكل خاطئ.
- 1المشكلة
- 2الفهم
- 3أمثلة محلولة
- 4التوقع
- 5التطبيق
- 6التحدي
المشكلة التي نقوم بحلها
في الدرس السابق تعلمنا كيف نطرح الأسئلة — مثل هل age >= 18 صحيحة أم خاطئة؟ ولكن البرنامج لم يفعل شيئاً بتلك الإجابة سوى طباعة True أو False.
حان الوقت الآن للتصرف بناءً على تلك الإجابة. مسار يُتبع إذا تحقق الشرط، ومسار آخر إذا لم يتحقق. هذه هي اللحظة التي يتوقف فيها الكود عن كونه مجرد قائمة خطوات خطية ويبدأ في اتخاذ القرارات.
وهنا يختلف بايثون عن العديد من اللغات الأخرى: فالأسطر التي تتبع شرطاً معيناً وتلك التي تقع خارجه تتحدد بواسطة المسافات البادئة (Indentation). لا توجد أقواس معقوفة {}. قد يبدو الأمر غريباً في البداية ولكنك ستعتاد عليه وسيعجبك — لأن الكود الذي يبدو منظماً هو كود منظم بالفعل.
في نهاية هذا الدرس ستكون قادراً على
- تنفيذ الكود شرطياً باستخدام
if - تقديم خيار بديل باستخدام
elseوعدة خيارات باستخدامelif - تطبيق المسافات البادئة بشكل صحيح وقراءة وحل خطأ
IndentationError - فهم سبب أهمية ترتيب الشروط — وهو الفخ الأكبر في هذا الدرس
- تداخل الشروط (Nesting) ومعرفة متى تتجنبه
المتطلبات السابقة: True و False — تعلّم طرح الأسئلة.
أبسط صورة للجملة الشرطية
age = 22
if age >= 18:
print("You may enter")
print("Program finished")You may enter
Program finishedيتكون هذا الهيكل من ثلاثة أجزاء:
- الكلمة المفتاحية
if، تليها العبارة الشرطية - النقطتان الرأسيتان
:في نهاية سطر الشرط — نسيانهما هو الخطأ الأكثر شيوعاً - الأسطر التالية، وتكون مُزاحة بأربع مسافات بادئة — هذه الأسطر المُزاحة هي التي يحكمها الشرط
لو كانت قيمة age تساوي 15، فلن يُنفّذ أمر print الأول، بينما سيُنفّذ الأخير دائماً — لأنه يقع خارج نطاق الشرط.
المسافة البادئة تعني المعنى البرمجي
هذان البرنامجان يتطابقان تقريباً في الأحرف ولكن سلوكهما مختلف تماماً:
score = 30
if score >= 50:
print("Passed")
print("Certificate issued")عند تشغيل هذا الكود، لن يظهر أي شيء في الطرفية — لأن كلا السطرين يقعان داخل نطاق الشرط، والشرط غير متحقّق.
score = 30
if score >= 50:
print("Passed")
print("Certificate issued")Certificate issuedسطر print الثاني أصبح الآن خارج نطاق الشرط، لذا سيُنفّذ دائماً — وتم إصدار شهادة لشخص رسب في الاختبار! سطر واحد أُزيح بشكل خاطئ يكسر منطق العمل بالكامل، دون أن يُصدر بايثون أي خطأ لأن كلا البرنامجين صحيحان نحوياً.
استخدم 4 مسافات، وتجنب زر Tab. يقبل بايثون كلاً منهما، ولكن خلطهما في ملف واحد يسبب خطأ TabError. في محرر VS Code، الضغط على Tab يقوم تلقائياً بإدراج 4 مسافات مسطرة.else — المسار البديل
age = 15
if age >= 18:
print("You may enter")
else:
print("Sorry, adults only")Sorry, adults onlyلا تحمل else أي شرط، لأن معناها الضمني هو: "إذا لم يتحقق أي شرط مما سبق".
elif — تعدد المسارات والخيارات
marks = 72
if marks >= 80:
grade = "A"
elif marks >= 70:
grade = "B"
elif marks >= 60:
grade = "C"
elif marks >= 40:
grade = "D"
else:
grade = "F"
print(f"Marks {marks} gives grade {grade}")Marks 72 gives grade Belif اختصار لـ "else if" (وإلا إذا). ما يحدث هو أن بايثون يتفقد الشروط بالترتيب من الأعلى إلى الأسفل، ويُنفّذ كتلة أول شرط يتحقق ثم يخرج فوراً من السلسلة الشرطية بالكامل دون فحص باقي الشروط.
وهنا الفخ الأكبر في الشروط
نظراً لأن elif تتوقف عند أول شرط يتحقق، فإن كتابة الشروط بترتيب خاطئ تؤدي لبرنامج يعمل دون أخطاء ولكنه يعطي نتائج غير صحيحة:
marks = 95
if marks >= 40:
grade = "Pass"
elif marks >= 80:
grade = "Excellent"
else:
grade = "Fail"
print(grade)Passحصل الطالب على 95 درجة ولم يحصل على Excellent! لأن الشرط 95 >= 40 تحقق فوراً، فتوقف بايثون عنده ولم ينظر إلى الشرط الثاني إطلاقاً.
القاعدة الذهبية: ضع الشرط الأكثر دقة وتحديداً أولاً، والشرط الأوسع والأشمل في النهاية.
تداخل الشروط (Nesting)
is_logged_in = True
is_admin = False
if is_logged_in:
if is_admin:
print("Welcome, admin")
else:
print("Welcome, user")
else:
print("Please log in")Welcome, userيمكن في كثير من الأحيان تبسيط ذلك باستخدام المعامل and:
is_logged_in = True
is_admin = False
if is_logged_in and is_admin:
print("Welcome, admin")
elif is_logged_in:
print("Welcome, user")
else:
print("Please log in")Welcome, userمثال عملي متكامل
ملف fare.py:
# Work out a ticket fare from age and day of week
age = int(input("Passenger age : "))
day = input("Day of week : ").strip().lower()
base_fare = 120.0
# Most specific rule first, loosest last
if age < 5:
fare = 0.0
category = "Infant"
elif age < 18:
fare = base_fare * 0.5
category = "Child"
elif age >= 60:
fare = base_fare * 0.7
category = "Senior"
else:
fare = base_fare
category = "Adult"
is_weekend = day == "saturday" or day == "sunday"
if is_weekend:
fare = fare * 1.2
print()
print(f"Category : {category}")
print(f"Weekend : {is_weekend}")
print(f"Fare : {fare:.2f}")Passenger age : 65
Day of week : Sunday
Category : Senior
Weekend : True
Fare : 100.80حالات الخطأ الشائعة
SyntaxError: expected ':' نسيان النقطتين الرأسيتين في نهاية سطر if أو elif أو else.
IndentationError: expected an indented block after 'if' statement السطر الذي يلي if غير مُزاح بمسافة بادئة.
IndentationError: unexpected indent سطر مُزاح بمسافة بادئة دون أن يتبع لأي كتلة برمجية.
TabError: inconsistent use of tabs and spaces in indentation خلط مسافات المسطرة مع Tab داخل نفس الملف.
Step 4 of 6 — Predict
Check your understanding
With 85 marks, what does this program print?
marks = 85
if marks >= 40:
print("Pass")
elif marks >= 80:
print("Excellent")
else:
print("Fail")- APass
- BExcellent
- CPass Excellent
- DExcellent Pass
What does this program print?
score = 30
if score >= 50:
print("Passed")
print("Done")- ADone
- BPassed Done
- CPassed
- DNothing at all
Even when the person types 25, this stops with a TypeError. What is the cause, and the fix?
age = input("Age: ")
if age >= 18:
print("Adult")
else:
print("Minor")- A`input()` gives text, and text cannot be compared with a number — it needs `age = int(input("Age: "))`
- B`>=` cannot be used in an `if` condition; it has to be `>`
- C`age` is a reserved word, so the comparison failed
- DAn `elif` is required before an `else`
Answering needs an account
Sign in to check your answers
The questions are above, and working them out in your head is the part that matters. Sign in to see the answers, the explanations and the three-level hints.
دورك الآن
اكتب ملفاً باسم bmi.py يستقبل الطول بالأمتار والوزن بالكيلوغرام، ويحسب مؤشر كتلة الجسم (BMI) ويحدد الفئة:
المعادلة: bmi = weight / (height * height)
الفئات:
- أقل من 18.5 — Underweight (نقص في الوزن)
- من 18.5 إلى 24.9 — Normal (وزن طبيعي)
- من 25 إلى 29.9 — Overweight (زيادة وزن)
- 30 فما فوق — Obese (سمنة)
الشروط المطلوبة:
- طباعة الناتج مع تقريبه لمنزلة عشرية واحدة
- ترتيب الشروط بصورة صحيحة لتعمل الفئات الأربع بدقة
- في حال كان الطول المدخل
0، أوقف العملية واطبع تنبيهاً قبل القسمة لتفاديZeroDivisionError - جرّب البرنامج مع عدة قيم مختلفة وعند الحدود (مثل BMI = 25 تماماً).
There is more in this mission
What you read above is the complete mission — nothing was cut out of it. Pro adds:
- ما يحدث فعلياً في الكواليس — كيف ينفذ بايثون هذا الكود
- الحل الكامل للتمرين مشروحاً خطوة بخطوة
- تمارين إضافية أكثر صعوبة وتحدياً
- أسئلة المقابلات الوظيفية حول هذا الموضوع مع نموذج الإجابة
Step 6 of 6
التحدي — the chapter quiz
عشرة أسئلة متدرجة من السهل إلى الصعب. الأسئلة الأخيرة صعبة عن قصد.
Sign in to take the quiz