الجمل الشرطية

في الدرس السابق تعلمنا كيفية إصدار أحكام صواب/خطأ باستخدام المنطق البولياني. الآن دعنا نتعلم الجمل الشرطية — جعل البرنامج ينفذ كوداً مختلفاً بناءً على شروط مختلفة. هذا أحد أهم هياكل التحكم في أي لغة برمجة.


1. جملة if: شرط بسيط

صيغة if واضحة ومباشرة:

PYTHON
if condition:
    code to execute when condition is True

لاحظ النقطتين : و المسافة البادئة (عادة 4 مسافات) — المسافة البادئة تخبر بايثون أي كود ينتمي إلى if.

PYTHON
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.")

المخرجات:

TEXT
You are an adult!
This is also inside the if block.
This is outside the if and always executes.
💡 نصيحة: تستخدم بايثون المسافة البادئة لتحديد كتل الكود (اللغات الأخرى تستخدم {}). الكود داخل نفس كتلة if يجب أن يكون له نفس المسافة البادئة. إذا كنت معتاداً على C أو Java، قد تحتاج بعض الوقت لتعتاد، لكن بايثون تُجبرك على كتابة كود نظيف.

مثال: فحص نجاح/رسوب (الصعوبة ⭐)

PYTHON
score = 75

if score >= 60:
    print("Congratulations, you passed!")
    print(f"Your score is {score}.")

print("Score recorded.")
▶ جرّب الكود

المخرجات:

TEXT
Congratulations, you passed!
Your score is 75.
Score recorded.

2. if-else: اختر بين اثنين

عندما يكون الشرط صحيحاً، افعل شيئاً؛ عندما يكون خاطئاً، افعل شيئاً آخر:

PYTHON
if condition:
    execute when True
else:
    execute when False
PYTHON
score = 45

if score >= 60:
    print("Passed!")
else:
    print("Failed, need to retake.")

المخرجات:

TEXT
Failed, need to retake.

المسافة البادئة لـ if و else

PYTHON
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) للتعامل مع فروع متعددة:

PYTHON
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 بأكمله.

PYTHON
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." ضع الشروط الأكثر صرامة أولاً.

مثال: نظام طلب المطعم (الصعوبة ⭐⭐)

PYTHON
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!")
▶ جرّب الكود

المخرجات:

TEXT
=== 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. الشروط المتداخلة

يمكن أن تحتوي الشروط على شروط أخرى. هذا يُسمى التداخل.

PYTHON
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.")

المخرجات:

TEXT
Adult, can enter.
Has ticket, please proceed.

لا تفرط في التداخل

التداخل بحد ذاته ليس خطأ، لكن أكثر من 3 مستويات يجعل الكود صعب القراءة:

PYTHON
# ❌ غير موصى به: تداخل كثير
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.")

قم بتسويته باستخدام العوامل المنطقية:

PYTHON
# ✅ موصى به: استخدم 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.")
💡 نصيحة: قاعدة عملية: إذا تجاوز التداخل 3 مستويات، فكر في دمج الشروط باستخدام and/or، أو استخراج المنطق العميق في دالة. الكود الجيد "مسطح"، وليس "عميقاً."

مثال: حاسبة تكلفة الشحن (الصعوبة ⭐⭐)

PYTHON
# حساب الشحن بناءً على المنطقة والوزن ومستوى العضوية
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}")
▶ جرّب الكود

المخرجات:

TEXT
Region: domestic
Weight: 3.5kg
Shipping: $15

5. التعبير الثلاثي (التعبير الشرطي)

لدى بايثون صيغة if-else في سطر واحد تسمى التعبير الثلاثي:

PYTHON
# الطريقة العادية
age = 20
if age >= 18:
    status = "adult"
else:
    status = "minor"

# التعبير الثلاثي (سطر واحد)
status = "adult" if age >= 18 else "minor"

print(status)   # adult

البنية:

TEXT
value1 if condition else value2

إذا كان الشرط صحيحاً، خذ value1؛ وإلا، خذ value2.

الاستخدام العملي

PYTHON
# أخرج نتيجة بناءً على الدرجة
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:

PYTHON
if age >= 18:
    pass    # TODO: أضف منطق البالغين لاحقاً
else:
    print("Minor, cannot register.")

pass تعني "لا تفعل شيئاً هنا، استمر." تُستخدم غالباً لـ:

PYTHON
# استخدام في العالم الحقيقي
if user_age >= 18:
    register_user()      # تابع مع التسجيل
else:
    pass                 # لا معالجة خاصة للقصر حتى الآن
💡 نصيحة: إذا كنت تستخدم VS Code، اكتب تعليق # TODO مع pass. سيجمع VS Code جميع عناصر TODO للرجوع إليها لاحقاً.


حالات الاستخدام الشائعة


❓ أسئلة شائعة

س ما الفرق بين 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 عندما يمكن

📝 تمارين

  1. أساسي (الصعوبة ⭐): اكتب برنامجاً للتحقق مما إذا كان الرقم فردياً أم زوجياً. أدخل عدداً صحيحاً؛ أخرج "فردي" أو "زوجي." تلميح: n % 2 == 0 تعني زوجي.

  2. متوسط (الصعوبة ⭐⭐): اكتب برنامج تقييم صحة BMI. أدخل الوزن (كجم) والطول (م)، احسب BMI، ثم أخرج:

    • BMI < 18.5 → "نحيف"
    • 18.5 ≤ BMI < 24 → "طبيعي"
    • 24 ≤ BMI < 28 → "وزن زائد"
    • BMI ≥ 28 → "سمنة"
  3. تحدي (الصعوبة ⭐⭐⭐): اكتب آلة حاسبة بسيطة. يستقبل البرنامج ثلاث مدخلات: الرقم الأول، العامل (+ - * /)، الرقم الثاني. نفذ العملية وأخرج النتيجة. تعامل مع:

    • القسمة على صفر: أخرج "لا يمكن القسمة على صفر"
    • عامل غير صالح: أخرج "عامل غير صالح"
    • الحالة العادية: أخرج نتيجة العملية الحسابية
100%