Menu
العربية

حلقة for في بايثون: التكرار على القوائم والنصوص

تعرّف على طريقة عمل حلقة for في بايثون مع أمثلة عملية للتكرار على القوائم والنصوص والقواميس و range، واستخدام break و continue و enumerate.

حلقة for في بايثون هي حلقة "لكل عنصر"

لو كنت قادمًا من لغة بأسلوب C، فستبدو لك حلقات التكرار في بايثون مختلفة بعض الشيء. لا يوجد هنا النمط المعتاد for (i = 0; i < n; i++) القائم على عدّاد. حلقة for في بايثون هي حصريًا حلقة لكل عنصر (for each)، بمعنى أنك تعطيها مجموعة من العناصر، فتسلّمك عنصرًا واحدًا في كل دورة.

main.py
Output
Click Run to see the output here.

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

لاحظ الصيغة العامة: for <name> in <iterable>: متبوعةً بجسم مُزاح للداخل. إزاحة، نقطتان، ثم الجسم؛ نفس البنية المستخدمة مع if.

ما الذي يُعدّ قابلًا للتكرار (Iterable)؟

عمليًا، أي شيء يحتوي على سلسلة من القيم. القوائم، والصفوف (tuples)، والسلاسل النصية، وكائنات range، والقواميس، والمجموعات، والملفات، ومعظم الكائنات المخصصة التي ستُنشئها بنفسك.

main.py
Output
Click Run to see the output here.

الجمال في هذا الأسلوب إنه موحّد — صياغة واحدة تتعامل مع أشكال بيانات متعددة.

العدّ باستخدام range()

لما تحتاج فعلاً لعدّاد — يعني "نفّذ هذا الأمر عشر مرات"، أو "كرّر على الفهارس من 0 إلى 9" — استخدم for i in range في بايثون:

main.py
Output
Click Run to see the output here.

هذه الحلقة تطبع 0 و 1 و 2 و 3 و 4. الدالة range(stop) تعدّ بدءًا من 0 وتتوقف قبل stop دون أن تشمله. أما range(start, stop) فتتيح لك تحديد قيمة البداية، و range(start, stop, step) تعطيك تحكمًا في مقدار الخطوة:

main.py
Output
Click Run to see the output here.

هناك صفحة مخصصة لـ range قادمة قريبًا لأنها تستحق فهمًا أعمق قليلًا. الآن يكفي أن تعرف أن range(n) يعطيك n تكرارًا مرقّمة من 0 إلى n-1.

دالة enumerate في بايثون: التكرار مع الفهرس

حاجة شائعة جدًا: "أريد الفهرس والقيمة معًا." أول ما يخطر ببال المبتدئ هو استخدام range(len(...))، لكن بايثون يوفّر أداة ألطف بكثير:

main.py
Output
Click Run to see the output here.

دالة enumerate() تُرجع أزواجًا على الشكل (index, value). أما المتغيران المكتوبان بعد for فوظيفتهما تفكيك الزوج إلى اسمين منفصلين: index وcolor. أنظف بكثير من الطريقة التالية:

main.py
Output
Click Run to see the output here.

إذا أردت أن يبدأ العدّ من 1 بدلاً من 0، مرّر start=1:

main.py
Output
Click Run to see the output here.

دالة zip في بايثون: التكرار على تسلسلين في نفس الوقت

عندما يكون لديك قائمتان بنفس الطول وتريد دمج عناصرهما سوياً:

main.py
Output
Click Run to see the output here.

zip يتوقف عند أقصر تسلسل. وإذا أردتَ أن يستمر ويملأ القيم الناقصة بـ None، استخدم itertools.zip_longest.

التكرار على قاموس بايثون

القواميس تمنحك خيارات متعددة لما تريد التكرار عليه:

main.py
Output
Click Run to see the output here.

في أغلب الأحيان ستحتاج إلى .items()، لأنها تعطيك المفتاح والقيمة معًا في سطر واحد مقروء وواضح.

التحكم في الحلقة باستخدام break و continue في بايثون

أحيانًا تحتاج للخروج من الحلقة مبكرًا، أو لتخطّي دورة معيّنة والمتابعة مع التي تليها.

break تُنهي الحلقة فورًا:

main.py
Output
Click Run to see the output here.

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

أما continue فيتخطى ما تبقى من التكرار الحالي وينتقل مباشرة إلى التكرار التالي:

main.py
Output
Click Run to see the output here.

كلاهما صحيح الاستخدام، لكن continue قد يجعل متابعة الحلقة أصعب إذا استخدمته أكثر من مرة. في الغالب، استخدام if/else البسيط يكون أوضح للقارئ.

جملة else مع الحلقات في بايثون

تتميز بايثون بخاصية لا تجدها في معظم اللغات الأخرى: إمكانية إضافة جملة else إلى الحلقة. هذه الجملة تُنفَّذ عندما تنتهي الحلقة بشكل طبيعي دون أن تصادف break.

main.py
Output
Click Run to see the output here.

مفيدة، لكنها قد تكون مربكة في البداية. لا تشعر بأنك مضطر لاستخدامها، فاستعمال متغير منطقي (boolean flag) خارج الحلقة غالباً ما يكون أوضح للمبتدئين.

تعديل القائمة أثناء التكرار عليها

من الأخطاء الشائعة التي يجب الانتباه لها: لا تُضف عناصر إلى القائمة أو تحذف منها وأنت تمر عليها داخل حلقة for. عند فعل ذلك، تختلط المؤشرات على بايثون ولا يعود يعرف أيها لا يزال صالحاً، فينتهي بك الأمر إما بتجاوز بعض العناصر أو بالحصول على خطأ. الحل الآمن هو أن تبني قائمة جديدة بدلاً من التعديل على الأصلية:

main.py
Output
Click Run to see the output here.

أو، بمجرد أن تعتاد على الأمر، يمكن استخدام list comprehension لتحقيق نفس النتيجة في سطر واحد — وهذا ما سنتطرق إليه في فصل Collections.

مثال عملي صغير من البداية للنهاية

لنجمع بعض ما تعلمناه في مثال واحد — نقرأ قائمة، نفلترها، ثم نطبعها باستخدام enumerate:

main.py
Output
Click Run to see the output here.

التالي: حلقات while

تُعدّ for الخيار الأنسب عندما تعرف مسبقًا ما الذي ستُكرِّر المرور عليه، بينما تأتي while في المقدمة حين تريد الاستمرار في التكرار إلى أن يتغيّر شرط معيّن — وهذا ما سنتناوله في الدرس القادم.

الأسئلة الشائعة

كيف تعمل حلقة for في بايثون؟

الصيغة for item in sequence: تنفّذ الكود المُزاح داخل الحلقة مرة واحدة لكل عنصر في التسلسل، حيث يأخذ item قيمة كل عنصر بالتتابع. والتسلسل هنا قد يكون قائمة أو tuple أو نصًا أو قاموسًا أو range، أو أي كائن يدعم iterator.

ما الفرق بين break و continue؟

break يخرج من الحلقة فورًا ويتجاهل باقي التكرارات، أما continue فيتخطّى بقية التكرار الحالي فقط وينتقل إلى التكرار التالي. بكلمات أبسط: break معناه "خلصنا"، و continue معناه "تجاوز هذه الحالة فقط".

كيف أحصل على الفهرس أثناء التكرار في بايثون؟

استخدم enumerate(...) حول التسلسل لتحصل على أزواج (index, value) بهذا الشكل: for i, item in enumerate(items):. هذه الطريقة أنظف بكثير من إنشاء عدّاد يدوي وزيادته بـ i += 1 في نهاية كل تكرار.

تعلّم البرمجة مع Coddy

ابدأ الآن