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

دقائق القراءة: 5
شرح حلقة for في لغة بايثون مع أمثلة عملية على التكرار والتعامل مع القوائم

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

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

في هذا المقال، سنشرح أساسيات حلقة for في Python بلغة واضحة، مع أمثلة عملية تساعدك على فهم طريقة عملها واستخدامها مع range() وenumerate().

ما هي حلقة for في بايثون؟

حلقة for هي بنية تكرارية تُستخدم للمرور على عناصر تسلسل معين، مثل:

  • القوائم list
  • السلاسل النصية string
  • النطاقات العددية الناتجة عن range()

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

كيف تبدو حلقة for في لغات برمجة أخرى؟

في كثير من اللغات مثل JavaScript أو Java أو C، تحتوي حلقة for غالباً على ثلاثة أجزاء رئيسية:

  1. تهيئة المتغير.
  2. الشرط الذي يحدد استمرار الحلقة.
  3. تحديث المتغير بعد كل دورة.

مثال في JavaScript:

for (let i = 0; i < 10; i++) {
  console.log('Counting numbers');
}

في هذا المثال:

  • يبدأ المتغير i بالقيمة 0.
  • تستمر الحلقة طالما أن الشرط i < 10 صحيح.
  • بعد كل دورة، تتم زيادة i بمقدار 1 باستخدام i++.

أما في Python، فالصياغة أبسط وأكثر وضوحاً، وهذا من أسباب سهولة قراءة اللغة.

صياغة حلقة for في بايثون

الصيغة الأساسية تبدو كالتالي:

for item in sequence:
    execute_expression

ويتكوّن هذا الشكل من العناصر التالية:

  • for: الكلمة المفتاحية التي تبدأ الحلقة.
  • item: متغير مؤقت يحمل قيمة العنصر الحالي أثناء كل دورة.
  • in: تربط المتغير بالتسلسل الذي نريد المرور عليه.
  • sequence: التسلسل المراد التكرار على عناصره.
  • :: تشير إلى بداية جسم الحلقة.
  • المسافة البادئة indentation: وهي جزء أساسي في Python. غالباً تُكتب أربعة مسافات قبل أوامر جسم الحلقة.

إذا أهملت المسافات البادئة بشكل صحيح، فقد يظهر الخطأ IndentationError.

كيف تعمل حلقة for على القوائم؟

لنفترض أن لدينا قائمة مشتريات:

groceries = ["bananas", "butter", "cheese", "toothpaste"]

يمكننا المرور على كل عنصر فيها باستخدام حلقة for كما يلي:

for grocery in groceries:
    print(grocery)

في هذا المثال، المتغير grocery هو متغير مؤقت. في كل دورة من دورات الحلقة، يحصل على قيمة جديدة من عناصر القائمة:

  • في المرة الأولى: bananas
  • في المرة الثانية: butter
  • ثم: cheese
  • وأخيراً: toothpaste

وسيكون الناتج:

bananas
butter
cheese
toothpaste

يمكنك اختيار أي اسم مناسب للمتغير المؤقت، مثل item أو g، لكن يُفضل أن يكون الاسم معبّراً وواضحاً لتسهيل قراءة الشيفرة.

استخدام حلقة for مع النصوص

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

مثال:

for letter in "Python":
    print(letter)

في كل دورة، ستحمل letter حرفاً واحداً من الكلمة حتى تنتهي جميع الأحرف.

كيف تستخدم range() مع حلقة for؟

إذا أردت تكرار الحلقة عدداً محدداً من المرات، فإن الدالة range() هي الخيار الأنسب. فهي تُنتج تسلسلاً من الأعداد الصحيحة يمكن المرور عليه بسهولة.

مثال بسيط على range()

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

الناتج:

0
1
2
3
4

رغم أننا كتبنا range(5)، فإن الرقم 5 نفسه لا يظهر في الناتج. ذلك لأن range() تتوقف قبل قيمة النهاية.

بمعنى آخر، range(5) تُنتج القيم من 0 إلى 4، أي خمس مرات تكرار.

عرض قيم range() كقائمة

إذا أردت رؤية القيم التي تولدها range() بشكل مباشر، يمكنك تحويلها إلى قائمة باستخدام list():

show_numbers = list(range(5))
print(show_numbers)

الناتج:

[0, 1, 2, 3, 4]

البدء من رقم مختلف

يمكنك تمرير وسيطين إلى range(): قيمة البداية وقيمة النهاية.

for i in range(1, 6):
    print(i)

الناتج:

1
2
3
4
5

هنا:

  • 1 هي قيمة البداية، وهي مشمولة.
  • 6 هي قيمة التوقف، وهي غير مشمولة.

استخدام خطوة مخصّصة مع step

تدعم range() وسيطاً ثالثاً اختيارياً يُستخدم لتحديد مقدار القفز بين الأرقام، وهو step. والقيمة الافتراضية له هي 1.

مثال على طباعة الأعداد الفردية:

for i in range(1, 10, 2):
    print(i)

الناتج:

1
3
5
7
9

في هذا المثال:

  • تبدأ الحلقة من 1.
  • تتوقف قبل 10.
  • تتحرك بمقدار 2 في كل مرة.

متى يكون استخدام range() مناسباً؟

تكون range() مفيدة عندما تحتاج إلى:

  • تكرار عملية عدداً محدداً من المرات.
  • المرور على سلسلة من الأرقام.
  • بناء منطق يعتمد على العدّاد counter.

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

استخدام enumerate() للحصول على الفهرس والقيمة معاً

في بعض الحالات، لا يكفي الوصول إلى العنصر فقط، بل قد تحتاج أيضاً إلى معرفة موقعه داخل القائمة. هنا تظهر أهمية الدالة enumerate().

لنعد إلى مثال قائمة المشتريات:

groceries = ["bananas", "butter", "cheese", "toothpaste"]

for index, grocery in enumerate(groceries):
    print(index, grocery)

الناتج:

0 bananas
1 butter
2 cheese
3 toothpaste

في كل دورة:

  • يحمل index رقم الفهرس.
  • يحمل grocery قيمة العنصر نفسه.

وتبدأ الفهارس في Python دائماً من 0.

تنسيق إخراج أكثر وضوحاً

يمكنك جعل المخرجات أكثر وصفاً باستخدام f-string:

groceries = ["bananas", "butter", "cheese", "toothpaste"]

for index, grocery in enumerate(groceries):
    print(f"Grocery: {grocery} is at index: {index}.")

الناتج:

Grocery: bananas is at index: 0.
Grocery: butter is at index: 1.
Grocery: cheese is at index: 2.
Grocery: toothpaste is at index: 3.

الفرق بين التكرار المباشر وenumerate()

الحالة الأسلوب الأنسب السبب
تحتاج إلى قيمة العنصر فقط for item in items أبسط وأكثر وضوحاً
تحتاج إلى الفهرس مع القيمة enumerate(items) يوفر الفهرس والعنصر في الوقت نفسه
تريد العدّ ضمن نطاق رقمي range() مثالي لتوليد تسلسل من الأعداد

أفضل ممارسات عند كتابة حلقة for في بايثون

  • اختر أسماء متغيرات واضحة مثل grocery أو index بدلاً من أسماء غامضة.
  • استخدم range() فقط عندما تحتاج فعلاً إلى أرقام متسلسلة.
  • استخدم enumerate() بدلاً من إدارة الفهرس يدوياً.
  • احرص على المسافات البادئة الصحيحة لتجنب أخطاء IndentationError.
  • اجعل جسم الحلقة بسيطاً قدر الإمكان لتحسين قابلية القراءة والصيانة.

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

  1. نسيان النقطتين : بعد سطر for.
  2. كتابة جسم الحلقة دون مسافة بادئة.
  3. الخلط بين نهاية range() والقيم التي تُطبع فعلياً.
  4. استخدام اسم متغير غير معبّر يربك قراءة الشيفرة.
  5. الاعتماد على الفهارس عندما يكون المرور المباشر على العناصر أبسط.

الخلاصة التقنية

حلقة for في Python من أكثر الأدوات أناقة وفعالية في كتابة الشيفرة المتكررة بطريقة نظيفة ومفهومة. قوتها الحقيقية لا تكمن فقط في التكرار، بل في بساطة تركيبها ومرونتها عند التعامل مع القوائم والنصوص والنطاقات العددية. ومن الناحية العملية، فإن إتقان for مع range() وenumerate() يشكّل أساساً مهماً لأي مطور يريد كتابة شيفرة أوضح، أقل تكراراً، وأسهل في الصيانة.

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *