الجمل الشرطية
في الدرس السابق تعلمنا كيفية إصدار أحكام صواب/خطأ باستخدام المنطق البولياني. الآن دعنا نتعلم الجمل الشرطية — جعل البرنامج ينفذ كوداً مختلفاً بناءً على شروط مختلفة. هذا أحد أهم هياكل التحكم في أي لغة برمجة.
1. جملة if: شرط بسيط
صيغة if واضحة ومباشرة:
if condition:
code to execute when condition is True
لاحظ النقطتين : و المسافة البادئة (عادة 4 مسافات) — المسافة البادئة تخبر بايثون أي كود ينتمي إلى if.
age = 18
if age >= 18:
print("You are an adult!")
print("This is also inside the if block.")
print("This is outside the if and always executes.")
المخرجات:
You are an adult!
This is also inside the if block.
This is outside the if and always executes.
{}). الكود داخل نفس كتلة if يجب أن يكون له نفس المسافة البادئة. إذا كنت معتاداً على C أو Java، قد تحتاج بعض الوقت لتعتاد، لكن بايثون تُجبرك على كتابة كود نظيف.
مثال: فحص نجاح/رسوب (الصعوبة ⭐)
score = 75
if score >= 60:
print("Congratulations, you passed!")
print(f"Your score is {score}.")
print("Score recorded.")
المخرجات:
Congratulations, you passed!
Your score is 75.
Score recorded.
2. if-else: اختر بين اثنين
عندما يكون الشرط صحيحاً، افعل شيئاً؛ عندما يكون خاطئاً، افعل شيئاً آخر:
if condition:
execute when True
else:
execute when False
score = 45
if score >= 60:
print("Passed!")
else:
print("Failed, need to retake.")
المخرجات:
Failed, need to retake.
المسافة البادئة لـ if و else
password = "123456"
if password == "123456":
print("Password correct, welcome back!")
else:
print("Wrong password, try again.")
print("If you forgot your password, click 'Forgot Password'.")
else تحتاج أيضاً إلى نقطتين :، ويجب أن تكون else محاذية لـ if المقابل (نفس مستوى المسافة البادئة).
3. if-elif-else: اختر من خيارات متعددة
السيناريوهات الواقعية غالباً ما يكون لها أكثر من احتمالين. استخدم elif (اختصار لـ else if) للتعامل مع فروع متعددة:
if condition1:
execute when condition1 is True
elif condition2:
execute when condition2 is True
elif condition3:
execute when condition3 is True
else:
execute when none of the above are True
تتحقق بايثون من الأعلى إلى الأسفل — أول شرط صحيح يتم تنفيذه، ثم يتم الخروج من هيكل if-elif-else بأكمله.
score = 85
if score >= 90:
print("Excellent!")
elif score >= 80:
print("Good!")
elif score >= 70:
print("Average.")
elif score >= 60:
print("Pass.")
else:
print("Failed, need to retake.")
# يُخرج: Good!
if score >= 60: أولاً، درجة 85 ستدخل فرع "Pass" ولن تصل أبداً إلى "Good" أو "Excellent." ضع الشروط الأكثر صرامة أولاً.
مثال: نظام طلب المطعم (الصعوبة ⭐⭐)
print("=== Today's Meals ===")
print("1. Braised Beef Noodles $10")
print("2. Shredded Pork Rice $8")
print("3. Tomato Egg Rice $6")
print("4. Egg Fried Rice $4")
choice = 3
if choice == 1:
print("You ordered Braised Beef Noodles, $10.")
elif choice == 2:
print("You ordered Shredded Pork Rice, $8.")
elif choice == 3:
print("You ordered Tomato Egg Rice, $6.")
elif choice == 4:
print("You ordered Egg Fried Rice, $4.")
else:
print("Sorry, invalid option.")
print("Enjoy your meal!")
المخرجات:
=== Today's Meals ===
1. Braised Beef Noodles $10
2. Shredded Pork Rice $8
3. Tomato Egg Rice $6
4. Egg Fried Rice $4
You ordered Tomato Egg Rice, $6.
Enjoy your meal!
4. الشروط المتداخلة
يمكن أن تحتوي الشروط على شروط أخرى. هذا يُسمى التداخل.
age = 20
has_ticket = True
if age >= 18:
print("Adult, can enter.")
if has_ticket:
print("Has ticket, please proceed.")
else:
print("Please buy a ticket first.")
else:
print("Minor, entry denied.")
المخرجات:
Adult, can enter.
Has ticket, please proceed.
لا تفرط في التداخل
التداخل بحد ذاته ليس خطأ، لكن أكثر من 3 مستويات يجعل الكود صعب القراءة:
# ❌ غير موصى به: تداخل كثير
user_input = "y"
is_admin = True
has_permission = True
if user_input == "y":
if is_admin:
if has_permission:
print("Operation successful!")
else:
print("No permission.")
else:
print("Not an admin.")
else:
print("Operation canceled.")
قم بتسويته باستخدام العوامل المنطقية:
# ✅ موصى به: استخدم and لتقليل التداخل
user_input = "y"
is_admin = True
has_permission = True
if user_input != "y":
print("Operation canceled.")
elif is_admin and has_permission:
print("Operation successful!")
else:
print("Insufficient permissions.")
and/or، أو استخراج المنطق العميق في دالة. الكود الجيد "مسطح"، وليس "عميقاً."
مثال: حاسبة تكلفة الشحن (الصعوبة ⭐⭐)
# حساب الشحن بناءً على المنطقة والوزن ومستوى العضوية
region = "domestic" # "domestic" أو "international"
weight = 3.5 # kg
is_vip = False
if region == "domestic":
if weight <= 1:
shipping = 10
elif weight <= 5:
shipping = 15
else:
shipping = 20
else:
if weight <= 1:
shipping = 50
elif weight <= 5:
shipping = 80
else:
shipping = 120
# VIP يحصل على خصم 20%
if is_vip:
shipping *= 0.8
print(f"Region: {region}")
print(f"Weight: {weight}kg")
print(f"Shipping: ${shipping:.0f}")
المخرجات:
Region: domestic
Weight: 3.5kg
Shipping: $15
5. التعبير الثلاثي (التعبير الشرطي)
لدى بايثون صيغة if-else في سطر واحد تسمى التعبير الثلاثي:
# الطريقة العادية
age = 20
if age >= 18:
status = "adult"
else:
status = "minor"
# التعبير الثلاثي (سطر واحد)
status = "adult" if age >= 18 else "minor"
print(status) # adult
البنية:
value1 if condition else value2
إذا كان الشرط صحيحاً، خذ value1؛ وإلا، خذ value2.
الاستخدام العملي
# أخرج نتيجة بناءً على الدرجة
score = 88
result = "passed" if score >= 60 else "failed"
print(f"Exam result: {result}") # Exam result: passed
# البحث عن القيمة الافتراضية
name = input("Enter your name: ") or "Guest"
greeting = f"Hello, {name}" if name else "Hello, Guest"
print(greeting)
elif) أو الفروع طويلة، التزم بـ if-elif-else العادي. الإيجاز ≠ قابلية القراءة.
6. pass: لا تفعل شيئاً
أحياناً تحتاج إلى عنصر نائب — بناء الجملة يتطلب كوداً، لكنك لم تقرر بعد ماذا تكتب. استخدم pass:
if age >= 18:
pass # TODO: أضف منطق البالغين لاحقاً
else:
print("Minor, cannot register.")
pass تعني "لا تفعل شيئاً هنا، استمر." تُستخدم غالباً لـ:
- عنصر نائب: الهيكل أولاً، املأ التفاصيل لاحقاً
- دالة فارغة:
def my_function(): pass - فئة فارغة:
class MyClass: pass
# استخدام في العالم الحقيقي
if user_age >= 18:
register_user() # تابع مع التسجيل
else:
pass # لا معالجة خاصة للقصر حتى الآن
# TODO مع pass. سيجمع VS Code جميع عناصر TODO للرجوع إليها لاحقاً.
حالات الاستخدام الشائعة
- التحقق من صحة النماذج: تحقق مما إذا كان الإدخال فارغاً، والتنسيق صحيحاً، والطول يفي بالمتطلبات.
- مستويات الأذونات: المستخدمون العاديون يرون واجهة A، مستخدمي VIP يرون واجهة B، المشرفون يرون واجهة C.
- آلة حالة اللعبة: تحقق مما إذا كانت اللعبة قد انتهت، أو تم اجتياز مستوى، أو تم كسب إنجاز.
- حساب السعر: الخصومات، عروض الأعضاء، العروض الموسمية — مجموعات شرطية مختلفة تؤدي إلى أسعار نهائية مختلفة.
- قائمة التنقل: المستخدم يدخل 1/2/3/4 على وحدة التحكم، والبرنامج يدخل وحدات وظيفية مختلفة.
❓ أسئلة شائعة
elif و if؟ لماذا لا نستخدم كلها if؟elif يُفحص فقط إذا لم تتحقق الشروط السابقة، بينما جمل if المستقلة تُفحص بغض النظر. مع ثلاث جمل if مستقلة لدرجة 85، "Excellent" و "Good" و "Average" كلها ستُنفّذ. مع if-elif-elif، فقط فرع "Good" الأول المتطابق سيشتغل. استخدم elif لـ "اختر واحداً"، استخدم جمل if متعددة لـ "افحص كل منها بشكل مستقل."
⚠️ س:لماذا يقوم VS Code تلقائياً بمسافة بادئة 4 مسافات بعد كتابتي if condition:؟ ج:بايثون تتطلب مسافة بادئة بعد النقطتين. إضافة بايثون في VS Code تتعامل مع هذا تلقائياً. إذا نسيت المسافة البادئة، تثير بايثون IndentationError: expected an indented block. المسافة البادئة في بايثون ليست "اقتراح أسلوب" — إنها بناء جملة. مسافة بادئة خاطئة تعني أن الكود لن يعمل.
س:هل يمكن للتعبيرات الثلاثية استخدام elif؟ ج:لا. التعبيرات الثلاثية تتعامل فقط مع "اختر بين اثنين" (value1 if condition else value2). للخيارات المتعددة، يمكنك تداخل التعبيرات الثلاثية: a if cond1 else b if cond2 else c، لكن هذا غير موصى به بشدة — التعبيرات الثلاثية المتداخلة شبه غير قابلة للقراءة. استخدم if-elif-else العادي للفروع المتعددة.
س:ما الفرق بين pass و return؟ ج:pass تعني "لا تفعل شيئاً، استمر في التنفيذ"؛ return تعني "اخرج فوراً من الدالة الحالية وأرجع قيمة" (سنغطي هذا لاحقاً). استخدام pass في كتلة if يتخطى تلك الكتلة ويستمر. استخدام return في دالة يخرج من الدالة فوراً. إنهما مفهومان مختلفان تماماً.📖 ملخص
ifيتبعه شرط؛ إذا كان صحيحاً، يتم تشغيل الكتلة ذات المسافة البادئةelseيعالج الحالة الخاطئة؛ لا يمكن استخدامه بمفردهelifيعالج فروعاً متعددة، يُفحص من الأعلى إلى الأسفل؛ أول شرط صحيح يُنفّذ- الشروط المتداخلة تعالج التسلسلات الهرمية المعقدة، لكن حافظ على التداخل تحت 3 مستويات
- التعبير الثلاثي
x if condition else yللاختيارات البسيطة في سطر واحد passعنصر نائب عندما يتطلب بناء الجملة كوداً لكن ليس لديك ما تفعله بعد- عادات جيدة: الشروط الأكثر صرامة أولاً، حافظ على التداخل تحت 3 مستويات، سوّ باستخدام
and/orعندما يمكن
📝 تمارين
-
أساسي (الصعوبة ⭐): اكتب برنامجاً للتحقق مما إذا كان الرقم فردياً أم زوجياً. أدخل عدداً صحيحاً؛ أخرج "فردي" أو "زوجي." تلميح:
n % 2 == 0تعني زوجي. -
متوسط (الصعوبة ⭐⭐): اكتب برنامج تقييم صحة BMI. أدخل الوزن (كجم) والطول (م)، احسب BMI، ثم أخرج:
- BMI < 18.5 → "نحيف"
- 18.5 ≤ BMI < 24 → "طبيعي"
- 24 ≤ BMI < 28 → "وزن زائد"
- BMI ≥ 28 → "سمنة"
-
تحدي (الصعوبة ⭐⭐⭐): اكتب آلة حاسبة بسيطة. يستقبل البرنامج ثلاث مدخلات: الرقم الأول، العامل (
+-*/)، الرقم الثاني. نفذ العملية وأخرج النتيجة. تعامل مع:- القسمة على صفر: أخرج "لا يمكن القسمة على صفر"
- عامل غير صالح: أخرج "عامل غير صالح"
- الحالة العادية: أخرج نتيجة العملية الحسابية



