أساسيات بايثون (3): المسافات البادئة Indentation Syntax

المسافات البادئة

🌟 مقدمة

في لغات البرمجة الأخرى مثل C أو Java أو JavaScript، تُستخدم الأقواس المعقوفة { } لتحديد كتلة الأوامر (Code Block). أما في بايثون فالأمر مختلف تماماً: 🚨 المسافة البادئة (Indentation) هي التي تحدد بداية ونهاية الكتلة البرمجية.

هذا يعني أن المسافات أو علامات التبويب (Tab) التي تضعها في بداية السطر ليست مجرد تجميل للكود، بل هي ⚙️ جزء أساسي من قواعد اللغة، وأي خطأ فيها يؤدي إلى فشل تنفيذ البرنامج. الـTAP يساوي 4 مسافات.

قبل البدء فضلاً قم بمراجعة الدرس السابق لمواكبة التعلم أساسيات بايثون (2): تهيئة Notepad++ وعرض أول كود برمجي : {alertSuccess}

أمثلة للـمسافات البادئة

المسافات البادئة

المسافات البادئة

🤔 لماذا المسافة البادئة إجبارية في بايثون؟

صممت بايثون لتكون لغة 📖 سهلة القراءة وواضحة. أحد مبادئ تصميمها هو: "يجب أن يبدو الكود كما يُقرأ".

عندما تُجبر المبرمج على وضع مسافات بادئة بطريقة صحيحة، يصبح الكود:
  • 🧹 أكثر تنظيماً.
  • 👀 أسهل في الفهم من قبل الآخرين (أو حتى من نفسك بعد فترة).
  • 🛡️ أقل عرضة للأخطاء المنطقية الناتجة عن نسيان إغلاق الأقواس.

🧱 ما هي الكتلة البرمجية (Code Block)؟

الكتلة البرمجية هي مجموعة من الأوامر التي يجب تنفيذها معاً في سياق معين، مثل:
  • 🔀 داخل جملة شرطية if.
  • 🔁 داخل حلقة تكرارية for أو while.
  • 🛠️ داخل تعريف دالة def.
  • 🏛️ داخل تعريف صنف class.
في بايثون، بعد كتابة السطر الذي يبدأ الكتلة (مثل if condition:)، يجب وضع نقطتين : في نهايته، ثم تبدأ أسطر الكتلة بمسافة بادئة موحدة.

📐 القواعد الأساسية للمسافة البادئة

  1. ✅ يجب أن تبدأ الكتلة بعد علامة النقطتين :.
  2. 📏 كل الأسطر داخل الكتلة نفسها يجب أن يكون لها نفس مقدار المسافة البادئة تماماً.
  3. 4️⃣ يُفضّل استخدام 4 مسافات لكل مستوى بادئة (هذا هو المعيار الرسمي في مجتمع بايثون - PEP 8).
  4. 🚫 لا تخلط بين المسافات وعلامات التبويب (Tab) في الملف الواحد، وإلا ستحصل على خطأ TabError.
 نصيحة: اضبط محرر النصوص (مثل VS Code أو PyCharm) ليقوم تلقائياً بتحويل ضغطة Tab إلى 4 مسافات.{alertInfo}

✅ مثال صحيح – جملة شرطية

if 5 > 2:
print("Five is greater than two!") # ⬅️ مسافة بادئة (4 مسافات)
print("This line is inside the if block.")
print("This line is outside the if block.") # ⬅️ لا توجد مسافة بادئ

🔊 الناتج:

Five is greater than two!
This line is inside the if block.
This line is outside the if block.
👆 لاحظ أن السطر الثالث بدون مسافة بادئة، لذا يعتبر خارج كتلة if ويُنفذ بغض النظر عن الشرط.

❌ مثال خاطئ – نسيان المسافة البادئة

if 5 > 2:
print("Five is greater than two!") # 😱 لا توجد مسافة بادئة → خطأ

💥 الخطأ الذي ستحصل عليه:
IndentationError: expected an indented block

📢 الرسالة واضحة: بايثون توقعت كتلة ذات مسافة بادئة بعد علامة : ولكنها لم تجدها.


❌ مثال خاطئ – مسافات غير متساوية داخل الكتلة

if 5 > 2:
print("First line") # 4 مسافات
print("Second line") # 5 مسافات → 😵 غير متساوٍ مع السطر الأول


💥 الخطأ:

IndentationError: unexpected indent
🧐 جميع الأسطر داخل الكتلة الواحدة يجب أن تبدأ من نفس العمود بالضبط.


🪆 المسافة البادئة المتداخلة (Nested Indentation)

عند وجود كتلة داخل كتلة أخرى، تزداد المسافة البادئة بمقدار ثابت (عادة 4 مسافات إضافية لكل مستوى تداخل).
if 10 > 5:
print("Ten is greater than five.")
if 20 > 15:
print("Twenty is also greater than fifteen.") # ⬅️ مستوى بادئة ثانٍ (8 مسافات)
print("Back to the first block.") # ⬅️ العودة إلى المستوى الأول (4 مسافات)
print("Outside all blocks.")

🔊 الناتج:

Ten is greater than five.
Twenty is also greater than fifteen.
Back to the first block.
Outside all blocks.
🔄 لاحظ كيف يعود مستوى المسافة البادئة إلى الخلف للإشارة إلى نهاية الكتلة الداخلية.


📄 حالات خاصة: سطر فارغ داخل الكتلة

يمكنك ترك سطر فارغ داخل الكتلة لتحسين القراءة، لكن يجب أن يكون السطر الفارغ بدون أي مسافات بادئة (أو بنفس عدد المسافات إذا كان المحرر يضيفها تلقائياً – يُفضّل أن يكون فارغاً تماماً).
if True:
print("Hello")

# هذا تعليق داخل الكتلة، المسافة البادئة قبله مهمة
print("World")
😌 لا يسبب السطر الفارغ أي خطأ لأنه لا يحتوي على كود، لكن التعليق داخل الكتلة يجب أن يكون مزاحاً مثل بقية الأسطر.


✍️ ماذا عن كتابة سطر واحد بعد النقطتين؟

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

if 5 > 2: print("Five is greater than two!")   # ⚠️ يعمل لكن تجنّبه
لكن بمجرد أن تريد إضافة سطر ثانٍ للكتلة، يجب أن تنتقل إلى سطر جديد مع مسافة بادئة.


🚨 الأخطاء الشائعة وكيفية تجنبها

😵 الخطأ

📝 الوصف

💊 الحل

IndentationError: expected an indented block

نسيت وضع مسافة بادئة بعد :

تأكد من وجود مسافة (أو Tab) في بداية السطر التالي.

IndentationError: unexpected indent

وضعت مسافة بادئة لسطر لا يجب أن يكون داخل كتلة

احذف المسافات

 الزائدة من بداية السطر.

IndentationError: unindent does not match any outer indentation level

عدم تطابق المسافات عند الخروج من كتلة متداخلة

تأكد أن عدد المسافات يعود بالضبط إلى مستوى الكتلة السابقة.

TabError: inconsistent use of tabs and spaces in indentation

خلطت بين المسافات و Tab في نفس الملف

استخدم إعداد "تحويل Tab إلى مسافات" في محررك.


🛠️ أدوات مساعدة

  • 🖥️ معظم محررات الأكواد الحديثة تُظهر خطاً عمودياً رفيعاً لتوضيح مستويات المسافة البادئة.
  • 🔍 يمكنك استخدام الأمر python -m tabnanny yourfile.py لفحص ملفك بحثاً عن خلط بين Tab والمسافات.
  • 📚 اتبع دليل الأسلوب الرسمي PEP 8 الذي يوصي باستخدام 4 مسافات لكل مستوى بادئة.


🏋️ تمارين تطبيقية

✏️ تمرين 1: صحح الكود التالي

if 3 > 1:
print("Three is greater than one.")
print("This should be inside the block.")
print("Done.")

🔎 الحل (اضغط للإظهار)
if 3 > 1:
print("Three is greater than one.") # ✅ أضف مسافة بادئة
print("This should be inside the block.")
print("Done.")


🖨️ تمرين 2: ماذا يطبع الكود التالي؟

x = 10
if x > 5:
print("A")
if x > 8:
print("B")
print("C")
print("D")
🔊 الناتج (اضغط للإظهار) A B C D 


💻 تمرين 3: اكتب كوداً يستخدم if متداخلة لطباعة "Hot" إذا كانت درجة الحرارة > 30، و "Very Hot" إذا كانت > 40، ثم اطبع "Done" خارج الكتل.


📋 مثال للحل (اضغط للإظهار)
temp = 42
if temp > 30:
print("Hot")
if temp > 40:
print("Very Hot")
print("Done")


🎓 خلاصة

  • 🐾 المسافة البادئة في بايثون إجبارية لتحديد كتل الأوامر.
  • 4️⃣ استخدم 4 مسافات لكل مستوى بادئة.
  • 🚫 لا تخلط بين المسافات و Tab.
  • 💢 أي خطأ في المسافات يؤدي إلى IndentationError أو TabError.
  • 🧼 الأكواد المنظمة باستخدام المسافة البادئة الصحيحة تكون واضحة وسهلة الصيانة.

في الدرس القادم سنتناول 💬 التعليقات (Comments) بشكل أوسع، ثم ننتقل إلى 🧬 أنواع البيانات الأساسية

إرسال تعليق

أحدث أقدم