الجمل الشرطية في بايثون: قرار بصياغة أقرب للإنجليزية
if هو أول أداة يلجأ إليها أي برنامج تقريبًا. تتيح لك الجمل الشرطية في بايثون أن يسلك الكود مسارًا معينًا عندما يتحقق شرط ما، ومسارًا آخر حين لا يتحقق. وبايثون تعبّر عن هذه الفكرة بشكل مباشر وواضح:
سطران، وقرار واحد. سطر if ينتهي بنقطتين رأسيتين، والسطر المُزاح تحته هو جسم الـ if — أي الكود الذي سيُنفَّذ عندما يكون الشرط صحيحًا. لو كانت قيمة hour مثلًا 15، لتم تجاهل الجسم بالكامل ولن يُطبع أي شيء.
المفتاح هنا هو الإزاحة (Indentation). بايثون يعرف أي الأسطر تنتمي إلى الـ if من خلال المسافات البيضاء في بدايتها. المتعارف عليه هو أربع مسافات لكل مستوى، فحافظ على الاتساق.
إضافة فرع else في بايثون
في أغلب الأحيان تريد أن يحدث شيء ما في كل الحالات: تنفيذ أمر معيّن عند تحقّق الشرط، وأمر آخر في غير ذلك. هنا يأتي دور else:
سطر else لا يحمل أي شرط، فهو يلتقط كل ما لم يتحقق في if.
تفرّعات متعددة باستخدام elif
حين تحتاج إلى أكثر من مسارين، ضع جُمل elif (اختصار "else if") بين if وelse:
تتحقّق بايثون من الشروط واحدًا تلو الآخر من الأعلى إلى الأسفل، وتُنفّذ الكتلة المرتبطة بـ أوّل شرط يتحقّق، ثم تتجاهل الباقي. هذا الترتيب من الأعلى إلى الأسفل مهم جدًا: لو وضعت score >= 60 قبل score >= 90، فسيحصل الجميع على تقدير D، لأن أول شرط صحيح هو الذي يفوز.
قاعدة بسيطة تستحق التذكّر: اجعل الشروط متنافية فيما بينها لأي قيمة مُدخَلة، ورتّبها بما يعكس طريقة تفكيرك الطبيعية في المشكلة. ابدأ بالحالات الأكثر تخصيصًا، واترك الأعمّ في النهاية.
القيم الصادقة (Truthy) داخل الشروط في بايثون
التعبير داخل if لا يُشترط أن يكون ناتجه True أو False بشكل صريح. بايثون تقبل أي قيمة وتُقرّر بنفسها ما إذا كانت صادقة (truthy) أم لا:
if items: تُقرأ وكأنها تقول: "إذا كانت القائمة تحتوي على أي شيء". القيم التي تُعتبر False منطقياً (falsy) في بايثون هي:
False0,0.0None- الحاويات الفارغة:
""،[]،{}،set()،()
وما عدا ذلك يُعتبر True منطقياً (truthy). الاعتماد على هذا المفهوم يجعل الكود أكثر سلاسة وقرباً من اللغة الطبيعية، لكن انتبه لملاحظة مهمة: إذا كان الصفر قيمة لها معنى فعلي عندك (مثل عدّاد وصل إلى الصفر بشكل مقصود)، فقارن صراحةً باستخدام is not None أو != 0 حتى لا تختلط عليك حالة "فارغ" مع حالة "صفر".
دمج الشروط في بايثون
المعاملات and و or و not تتيح لك بناء شروط مركّبة:
المقارنات المتسلسلة أنظف من استخدام and بشكل صريح عندما تشترك الأطراف في قيمة وسطى:
هذا يعطي نفس نتيجة 18 <= age and age < 65، لكنه يُقرأ كأنه متباينة رياضية.
الشروط المتداخلة في بايثون (Nested if)
تقدر تضع if داخل if آخر، وهذا مسموح تمامًا، وأحيانًا يكون أوضح طريقة لتنظيم الكود. لكنه في الوقت نفسه السبب الرئيسي الذي يجعل الجمل الشرطية صعبة المتابعة. إذا وجدت نفسك قد وصلت إلى ثلاثة مستويات من التداخل، ففكّر في تبسيط الكود عبر استخدام الإرجاع المبكر (early return) حين تبدأ بكتابة الدوال، أو عبر دمج الشروط في شرط واحد:
كلا الأسلوبين يؤدي الغرض. اختر الصيغة التي تبدو أوضح لـ قارئ يرى هذا الكود لأول مرة.
التعبير الشرطي المختصر (ternary if في بايثون)
لمّا تحتاج فقط تحدّد قيمة متغيّر بين خيارين حسب شرط معيّن، توفّر لك بايثون صيغة مختصرة وأنيقة:
اقرأها من البداية للنهاية هكذا: "دافئ إذا كانت الحرارة 70 على الأقل، وإلا فهي باردة". هذا الأسلوب ممتاز للإسناد المختصر بين خيارين. لكن توقّف عن استخدامه بمجرد أن تصبح الفروع طويلة أو تحتوي على عمليات متعددة — عند هذه النقطة، استخدام كتلة if/else كاملة يكون أوضح للقارئ.
if كتعبير في حالة واحدة فقط
على عكس بعض اللغات، جملة if في بايثون بحد ذاتها لا تُنتج قيمة. الصيغة الثلاثية (ternary) هي الوحيدة التي تفعل ذلك. لا يمكنك كتابة x = if ...: كما تفعل في Rust أو Kotlin. إذا أردت قيمة شرطية، استخدم الصيغة الثلاثية ternary if في بايثون؛ أما إذا أردت سلوكًا شرطيًا، فاستخدم كتلة if كاملة.
مثال صغير متكامل
إليك برنامجًا سريعًا يُصنّف درجة الحرارة:
لاحظ أن المنطق كله تقريبًا يدور حول تحديد قيمة المتغيّر advice. بمجرد النظرة الأولى، تقدر تعرف أي نطاق درجات حرارة يقابل أي رسالة. هذا هو الشكل اللي لازم تستهدفه وأنت تكتب شروطك — كل فرع صغير ومختصر، والهدف العام واضح من غير ما تحتاج تفكر كثيرًا.
الخطوة التالية
الجمل الشرطية في بايثون تخلي الكود يختار مساره، والحلقات تخليه يكرّر نفسه. في الدرس القادم، بنتعرف على حلقة for، وهي أكثر أنواع الحلقات استخدامًا في بايثون بفارق كبير، وشريك طبيعي للمجموعات (collections) اللي بتشوفها بعد صفحات قليلة.
الأسئلة الشائعة
كيف تعمل جملة if في بايثون؟
تكتب if condition: ثم كتلة مُزاحة (indented)، وهذه الكتلة تُنفَّذ فقط عندما يكون الشرط صحيحًا. يمكنك إضافة elif للتحقق من شروط إضافية، وelse في النهاية يعمل إذا لم يتحقق أي شرط قبله.
هل يوجد switch في بايثون؟
بدءًا من الإصدار 3.10 أضافت بايثون match/case لمطابقة الأنماط البنيوية (structural pattern matching)، وهي تغطي معظم استخدامات switch وأكثر. أما للحالات البسيطة فسلسلة if/elif لا تزال شائعة وكافية تمامًا.
ما هو الـ ternary if في بايثون؟
هو تعبير شرطي في سطر واحد بهذه الصيغة: result = a if condition else b. يُقرأ من اليسار إلى اليمين: أعطِ a إذا تحقق condition، وإلا أعطِ b. مفيد للإسنادات القصيرة من نوع إما/أو، لكنه يفقد وضوحه إذا طالت الفروع.