أساسيات بايثون 3: ما هي المسافة البادئة Indentation في بايثون؟ شرح مبسط مع حل الأخطاء

شرح المسافات البادئة Indentation في بايثون للمبتدئين

المسافة البادئة Indentation في بايثون هي الفراغ الموجود في بداية السطر، وتُستخدم لتحديد كتل التعليمات البرمجية التابعة للشروط والحلقات والدوال.

إذا بدأت تعلم بايثون بالعربي، فواحدة من أول الأشياء التي ستلاحظها هي أن بايثون تهتم كثيرًا بطريقة ترتيب الكود، خصوصًا شيء اسمه المسافات البادئة Indentation.

في لغات برمجة كثيرة مثل JavaScript أو Java أو C، يتم استخدام الأقواس المعقوفة { } لتحديد بداية ونهاية كتلة الكود. أما في لغة بايثون فالأمر مختلف: المسافة البادئة هي التي تحدد الكود التابع للشرط أو الحلقة أو الدالة.

في هذا الدرس من موقع بايثون العرب سنشرح معنى Indentation في Python، ولماذا تعتبر مهمة جدًا، وكيف تسبب أخطاء للمبتدئين مثل IndentationError و TabError، مع أمثلة واضحة وتمارين بسيطة.

{getToc} $title={محتوى المقال}

{alertInfo} المسافة البادئة في بايثون ليست مجرد تنسيق شكلي، بل هي جزء أساسي من قواعد كتابة الكود.

قبل البدء، يفضل مراجعة الدرس السابق من السلسلة: أساسيات بايثون 2: كتابة أول كود Python.

مثال صحيح على استخدام المسافة البادئة داخل if في بايثون

ما هي المسافات البادئة Indentation في بايثون؟

المسافة البادئة في بايثون هي الفراغ الذي نضعه في بداية السطر حتى نخبر Python أن هذا السطر تابع لكتلة معينة من الكود.

مثلاً، عندما نكتب شرطًا باستخدام if، فإن السطر الذي يجب تنفيذه عند تحقق الشرط يكون مزاحًا للداخل.

مثال صحيح:

age = 20

if age >= 18:
    print("Allowed")

لاحظ أن سطر print ليس في بداية السطر، بل توجد قبله مسافة بادئة. هذه المسافة تخبر Python أن أمر الطباعة تابع للشرط.

ما الوظيفة التي تقوم بها المسافة البادئة في لغة بايثون؟

وظيفة المسافة البادئة Indentation في لغة بايثون هي تحديد بداية ونهاية كتلة الكود التابعة لأمر معين.

تستخدم المسافات البادئة عادة داخل:

  • الشروط مثل if و else.
  • الحلقات مثل for و while.
  • الدوال مثل def.
  • الكلاسات مثل class.
  • التعامل مع الأخطاء مثل try و except.

بمعنى بسيط: المسافة البادئة تقول لبايثون: هذه الأسطر تنتمي لنفس الجزء من البرنامج.

{alertSuccess} إذا رأيت سطرًا ينتهي بعلامة النقطتين : فغالبًا السطر التالي يحتاج إلى مسافة بادئة صحيحة.

لماذا Indentation إجبارية في Python؟

صُممت بايثون لتكون لغة سهلة القراءة. لذلك لا تعتمد على الأقواس المعقوفة لتحديد الكتل البرمجية، بل تعتمد على ترتيب الأسطر والمسافات البادئة.

هذا يجعل الكود:

  • أوضح وأسهل في القراءة.
  • أكثر تنظيمًا للمبتدئين.
  • أقل ازدحامًا بالرموز.
  • أسهل في معرفة الكود الموجود داخل الشرط أو الحلقة أو الدالة.

لكن في المقابل، أي خطأ بسيط في المسافات قد يؤدي إلى ظهور خطأ في البرنامج.

مثال صحيح على المسافة البادئة داخل if

انظر إلى المثال التالي:

if 5 > 2:
    print("Five is greater than two")
    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 لأنهما مزاحان للداخل، أما السطر الأخير فهو خارج الشرط لأنه عاد إلى بداية السطر.

مثال على خطأ IndentationError بسبب نسيان المسافة البادئة في بايثون

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

من أشهر أخطاء المبتدئين كتابة شرط ثم نسيان إزاحة السطر التالي للداخل.

مثال خاطئ:

if 5 > 2:
print("Five is greater than two")

هذا الكود يسبب خطأ، لأن Python كان يتوقع كودًا مزاحًا للداخل بعد علامة النقطتين.

قد تظهر رسالة الخطأ بهذا الشكل:

IndentationError: expected an indented block

الصحيح:

if 5 > 2:
    print("Five is greater than two")
{alertWarning} بعد أي شرط أو حلقة أو دالة، يجب أن يكون الكود التابع لها مزاحًا للداخل.

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

خطأ آخر شائع هو أن تضع أسطرًا داخل نفس الكتلة، لكن بمستويات مختلفة من المسافات.

مثال خاطئ:

if 5 > 2:
    print("First line")
     print("Second line")

السطر الثاني داخل الشرط يحتوي على مسافة إضافية، لذلك قد يظهر خطأ مثل:

IndentationError: unexpected indent

الصحيح أن تكون الأسطر التابعة لنفس الكتلة على نفس مستوى المسافة:

if 5 > 2:
    print("First line")
    print("Second line")

كم عدد المسافات المطلوبة في بايثون؟

الأسلوب الشائع والمعتمد في مجتمع Python هو استخدام 4 مسافات لكل مستوى من المسافة البادئة.

مثال:

if 10 > 5:
    print("Correct indentation")

ليس المهم أن تحفظ عدد المسافات فقط، بل أن تجعلها ثابتة في الكود كله.

{alertInfo} للمبتدئين: استخدم 4 مسافات دائمًا، واضبط محرر الكود ليحوّل زر Tab إلى 4 مسافات.

ما الفرق بين Tab و Space في Python؟

يمكن إدخال المسافة البادئة بطريقتين:

  • Space: مسافات عادية.
  • Tab: زر Tab من لوحة المفاتيح.

المشكلة ليست في استخدام Tab وحده أو Space وحده، بل في خلط الاثنين داخل نفس الملف.

إذا خلطت بينهما قد يظهر خطأ:

TabError: inconsistent use of tabs and spaces in indentation

الحل الأفضل هو استخدام المسافات Spaces فقط، وضبط المحرر على تحويل Tab إلى Spaces.

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

عند استخدام if و else، يجب أن يكون الكود داخل كل جزء مزاحًا للداخل.

score = 75

if score >= 50:
    print("Pass")
else:
    print("Fail")

لاحظ أن سطر print("Pass") تابع لـ if، وسطر print("Fail") تابع لـ else.

لفهم الشروط أكثر، اقرأ: أساسيات بايثون 11: شرح if و else في Python للمبتدئين.

المسافة البادئة داخل for loop

الحلقات في بايثون تعتمد أيضًا على Indentation.

for i in range(5):
    print(i)

هنا سطر print(i) تابع للحلقة، لذلك يجب أن يكون مزاحًا للداخل.

لو كتبناه هكذا سيحدث خطأ:

for i in range(5):
print(i)

اقرأ أيضًا: أساسيات بايثون 12: شرح Loops في Python للمبتدئين.

المسافة البادئة داخل Functions

عند تعريف دالة باستخدام def، يجب أن يكون الكود التابع للدالة مزاحًا للداخل.

def say_hello():
    print("Hello Python")

say_hello()

سطر print داخل الدالة، لذلك هو مزاح للداخل. أما say_hello() فهو خارج الدالة لأنه عاد إلى بداية السطر.

يمكنك قراءة درس الدوال هنا: أساسيات بايثون 13: شرح Functions في Python للمبتدئين.

مقارنة بين المسافة البادئة داخل if و for و def في بايثون

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

أحيانًا يكون لدينا كتلة داخل كتلة أخرى، مثل شرط داخل شرط، أو شرط داخل حلقة.

في هذه الحالة نزيد المسافة البادئة مستوى جديدًا.

if 10 > 5:
    print("Ten is greater than five")

    if 20 > 15:
        print("Twenty is also greater than fifteen")

    print("Back to the first block")

print("Outside all blocks")

الناتج:

Ten is greater than five
Twenty is also greater than fifteen
Back to the first block
Outside all blocks

لاحظ كيف دخلنا إلى مستوى جديد داخل الشرط الثاني، ثم رجعنا للمستوى السابق، ثم خرجنا تمامًا من كل الكتل.

هل يمكن كتابة كود بعد النقطتين في نفس السطر؟

في بايثون يمكن أحيانًا كتابة أمر بسيط بعد النقطتين في نفس السطر:

if 5 > 2: print("Yes")

هذا الكود يعمل، لكنه ليس الأفضل للمبتدئين، ولا يُنصح باستخدامه كثيرًا لأنه يقلل وضوح الكود.

الأفضل كتابته بهذا الشكل:

if 5 > 2:
    print("Yes")
{alertInfo} اكتب الكود بشكل واضح، خصوصًا في مرحلة التعلم. الوضوح أهم من اختصار السطر.

أشهر أخطاء Indentation في Python وحلولها

الخطأ السبب الحل
expected an indented block نسيت وضع مسافة بادئة بعد سطر ينتهي بـ : أضف 4 مسافات قبل السطر التابع للكتلة
unexpected indent وضعت مسافة بادئة في مكان لا يحتاجها احذف المسافات الزائدة من بداية السطر
unindent does not match any outer indentation level خرجت من كتلة بمستوى مسافات غير صحيح تأكد أن مستوى المسافات يطابق المستوى السابق
TabError خلطت بين Tab و Space استخدم Spaces فقط واضبط المحرر

ولدينا درس منفصل في سلسلة مشكلة وحل يشرح هذا الخطأ: حل مشكلة IndentationError في Python.

كيف تتجنب أخطاء المسافة البادئة؟

لتقليل أخطاء Indentation أثناء تعلم بايثون، اتبع هذه النصائح:

  • استخدم 4 مسافات لكل مستوى.
  • لا تخلط بين Tab و Space.
  • استخدم محرر كود مثل VS Code أو PyCharm.
  • انتبه لأي سطر ينتهي بعلامة :.
  • اجعل الأسطر التابعة لنفس الكتلة على نفس المستوى.
  • لا تنقل الأكواد من الإنترنت بدون مراجعة المسافات.
{alertSuccess} عندما يظهر لك IndentationError، لا تخف. غالبًا المشكلة في مسافة ناقصة أو زائدة في بداية أحد الأسطر.
أشهر أخطاء Indentation في بايثون مثل نسيان المسافة وخلط Tab مع Space

أداة مفيدة لفحص مشاكل Tab والمسافات

في Python توجد أداة اسمها tabnanny تساعدك على اكتشاف مشاكل خلط Tab والمسافات داخل الملف.

يمكن تشغيلها من الطرفية بهذا الشكل:

python -m tabnanny yourfile.py

هذه الأداة مفيدة عندما يكون الخطأ غير واضح، خاصة إذا نسخت الكود من مكان آخر.

ما الوظيفة التي تقوم بها المسافة البادئة في لغة بايثون؟

تقوم المسافة البادئة في Python بتحديد الكود التابع لأمر معين مثل if أو for أو def، وبدونها تظهر أخطاء مثل IndentationError.

تمرين 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

لأن x أكبر من 5، ثم أكبر من 8، وبعدها يخرج الكود تدريجيًا من الكتل حسب مستوى المسافة البادئة.

تمرين 3: اكتب كودًا فيه if متداخلة

اكتب برنامجًا يطبع Hot إذا كانت درجة الحرارة أكبر من 30، ويطبع Very Hot إذا كانت أكبر من 40، ثم يطبع Done خارج الكتل.

مثال حل:

temp = 42

if temp > 30:
    print("Hot")

    if temp > 40:
        print("Very Hot")

print("Done")

أسئلة شائعة حول Indentation في Python

هل المسافة البادئة مهمة في بايثون؟

نعم، المسافة البادئة مهمة جدًا في بايثون لأنها تحدد الكود التابع للشروط والحلقات والدوال.

كم عدد المسافات البادئة في Python؟

الأفضل استخدام 4 مسافات لكل مستوى Indentation، وهذا هو الأسلوب الشائع في كتابة كود Python.

هل يمكن استخدام Tab بدل Space؟

يمكن استخدام Tab، لكن الأفضل للمبتدئين استخدام Spaces فقط، وتجنب خلط Tab مع Space داخل نفس الملف.

لماذا يظهر خطأ IndentationError؟

يظهر خطأ IndentationError عندما تكون المسافة البادئة غير صحيحة، مثل نسيان المسافة بعد if أو وضع مسافة زائدة في مكان غير مناسب.

ما معنى expected an indented block؟

معناه أن Python كان يتوقع وجود كود مزاح للداخل بعد سطر يحتاج إلى كتلة، مثل if أو for أو def.

روابط مهمة من بايثون العرب

مصدر خارجي مفيد

يمكنك أيضًا الرجوع إلى توثيق Python الرسمي حول المسافات البادئة: Python Documentation - Indentation.

خلاصة الدرس

في هذا الدرس من سلسلة أساسيات بايثون تعلمنا معنى المسافات البادئة Indentation في بايثون، وعرفنا أنها ليست مجرد تنسيق، بل جزء أساسي من قواعد اللغة.

تعلمنا أن المسافة البادئة تحدد الكود الموجود داخل if و for و def، وأن نسيانها أو عدم توحيدها قد يؤدي إلى أخطاء مثل IndentationError و TabError.

القاعدة الذهبية هي: استخدم 4 مسافات، لا تخلط Tab مع Space، وانتبه لأي سطر ينتهي بعلامة النقطتين :.

{alertSuccess} إذا فهمت Indentation جيدًا من البداية، ستتجنب واحدًا من أكثر أخطاء بايثون شيوعًا عند المبتدئين.

في الدرس القادم سنتعلم التعليقات Comments في Python، وكيف نستخدمها لشرح الكود وجعله أوضح.

إرسال تعليق

أحدث أقدم