أهلاً بك في درسنا الخامس. في الدرس الماضي، قمنا بتمكين برامجنا من اتخاذ القرارات باستخدام الجمل الشرطية if, elif, و else. لقد كانت خطوة كبيرة، حيث أصبح برنامجك قادراً على الاستجابة للظروف المختلفة.
ولكن، ماذا لو أردنا أن يقوم البرنامج بتكرار عملية معينة عدة مرات؟ مثلاً، بدلاً من التحقق من درجة طالب واحد، ماذا لو كان لدينا قائمة بـ 100 طالب؟ كتابة 100 جملة if ستكون مهمة مرهقة جداً وغير عملية.
هنا يأتي دور الحلقات التكرارية (Loops). في هذا الدرس، ستتعلم كيف تأمر البرنامج بتكرار مجموعة من التعليمات تلقائياً، مما يوفر عليك وقتاً وجهداً هائلاً ويفتح الباب أمام حل مشاكل أكثر تعقيداً. هذه المهارة أساسية جداً في طريقنا لبناء وكلاء الذكاء الاصطناعي، الذين غالباً ما يحتاجون إلى معالجة كميات كبيرة من البيانات أو تكرار المحاولة حتى تحقيق هدف معين.
هدفنا لهذا اليوم هو استخدام الحلقات التكرارية (for و while) لتكرار العمليات.
لماذا نحتاج إلى الحلقات التكرارية؟
لنفهم أهمية التكرار في البرمجة، شاهد هذا المقطع القصير. سيوضح لك المشكلة التي تواجهنا عند محاولة تنفيذ نفس المهمة عدة مرات، ويقدم فكرة التكرار كحل.
تعلم بايثون من الصفر للمبتدئين: شرح اللوب في بايثون Python Loop
يقدم هذا الفيديو من قناة OctuCode المفهوم الأساسي للحلقات التكرارية باستخدام تشبيه بسيط وواضح.
شاهد من بداية المقطع حتى الدقيقة 2:14. ركز على: مشكلة تكرار كتابة الكود (مثل طباعة عناصر قائمة). تشبيه "تشارلي شابلن" على خط الإنتاج، الذي يوضح كيف تتعامل الحلقة التكرارية مع كل عنصر في تسلسل واحدًا تلو الآخر.
كما رأيت، فكرة الحلقة التكرارية بسيطة: بدلاً من أن نكتب الأوامر مراراً وتكراراً، نكتبها مرة واحدة ونطلب من بايثون تكرارها على مجموعة من العناصر.
1. حلقة for: التكرار على مجموعة معروفة
النوع الأول من الحلقات هو for. نستخدمها عندما نعرف بالضبط ما هي المجموعة التي نريد أن نمر على عناصرها، مثل قائمة من الأسماء، أو حروف كلمة معينة، أو سلسلة من الأرقام. القاعدة العامة هي: استخدم for عندما تقول لنفسك "لكل عنصر في هذه المجموعة، افعل كذا".
بناء جملة for
لمعرفة كيفية كتابة حلقة for في بايثون، لنكمل مشاهدة نفس الفيديو. سيشرح لك المقطع التالي بالتفصيل كيف تعمل الحلقة خطوة بخطوة.
تعلم بايثون من الصفر للمبتدئين: شرح اللوب في بايثون Python Loop
يشرح هذا الجزء بالتفصيل البنية الأساسية لحلقة for وكيف تقوم بايثون بمعالجة كل عنصر في التسلسل.
شاهد من الدقيقة 2:14 حتى الدقيقة 6:28. ركز على النقاط التالية: for: الكلمة التي تبدأ الحلقة. letter (أو أي اسم آخر): متغير مؤقت يتم تخزين العنصر الحالي فيه في كل دورة. in: كلمة تفصل بين المتغير المؤقت والمجموعة. sammy: المجموعة التي نريد المرور على عناصرها (في هذه الحالة، سلسلة نصية). : و المسافة البادئة: تماماً كما في جملة if، تحدد المسافة البادئة الأوامر التي سيتم تكرارها.
للتوضيح، هذا مثال على حلقة for تمر على قائمة من الألوان وتطبع كل لون:
colors = ["أحمر", "أخضر", "أزرق"]
for color in colors:
print(color)
الناتج:
أحمر
أخضر
أزرق
في كل دورة من الحلقة، تقوم بايثون بأخذ عنصر واحد من قائمة colors، تضعه في المتغير المؤقت color، ثم تنفذ الكود الموجود داخل الحلقة (وهو print(color)).
التكرار لعدد معين من المرات باستخدام range()
في كثير من الأحيان، لا يكون لدينا قائمة جاهزة، بل نريد فقط تكرار عملية ما عددًا معينًا من المرات. هنا تأتي فائدة الدالة المدمجة range().
للحصول على شرح واضح ومفصل لكيفية استخدام range()، نقترح عليك قراءة الجزء المخصص لها في المقال التالي من أكاديمية حسوب.
كيفية إنشاء حلقات تكرار for في بايثون 3
يشرح هذا المقال من أكاديمية حسوب كيفية استخدام الدالة range() مع حلقات for لتوليد سلاسل رقمية والتحكم في عدد مرات التكرار.
اقرأ القسم الذي يحمل عنوان 'استخدام حلقات التكرار مع الدالة range()'. ركز على فهم المعاملات الثلاثة للدالة: start (البداية)، stop (النهاية، وهي غير مشمولة)، و step (الخطوة).
باختصار:
range(5): تولد أرقاماً من 0 إلى 4 (5 أرقام).range(2, 6): تولد أرقاماً من 2 إلى 5.range(0, 10, 2): تولد أرقاماً من 0 إلى 9، مع القفز بمقدار 2 في كل مرة (0, 2, 4, 6, 8).
مثال على استخدام range():
# طباعة "مرحباً" ثلاث مرات
for i in range(3):
print(f"المرة رقم {i+1}: مرحباً")
الناتج:
المرة رقم 1: مرحباً
المرة رقم 2: مرحباً
المرة رقم 3: مرحباً
المتغير i هنا يأخذ القيم 0، 1، ثم 2.
2. حلقة while: التكرار طالما أن الشرط صحيح
النوع الثاني من الحلقات هو while. نستخدمها عندما لا نعرف مسبقاً عدد المرات التي سنحتاج فيها للتكرار، ولكننا نعرف الشرط الذي يجب أن يتوقف التكرار عند عدم تحققه. القاعدة العامة هي: استخدم while عندما تقول لنفسك "استمر في فعل هذا طالما أن هذا الشرط صحيح".
لفهم الفرق الجوهري بين for و while، شاهد هذا المقطع الذي يقدم تشبيهاً ممتازاً.
for loop vs while loop تعلم بايثون من الصفر الفرق بين for while
يقدم هذا الفيديو من قناة OctuCode تشبيه 'صانع الكعك' لتوضيح الفرق بين حلقة for (عندما نعرف عدد التكرارات مسبقاً) وحلقة while (عندما نستمر حتى يتحقق شرط معين).
شاهد من الدقيقة 2:23 حتى الدقيقة 10:03. ركز على: الفكرة: متى نستخدم for ومتى نستخدم while. بناء الجملة: while condition:. المثال العملي: برنامج طلب كلمة المرور الذي يستمر في السؤال طالما أن الإدخال خاطئ.
تحذير: الحلقة اللانهائية (Infinite Loop)
أخطر خطأ يمكن أن تقع فيه عند استخدام while هو الحلقة اللانهائية. تحدث هذه المشكلة إذا لم يتغير الشرط الذي تعتمد عليه الحلقة أبداً ليصبح False.
مثال خاطئ:
x = 0
while x < 5:
print("هذا سيتكرر إلى الأبد!")
# قيمة x لا تتغير أبداً، لذا سيبقى الشرط x < 5 صحيحاً إلى الأبد.
مثال صحيح:
x = 0
while x < 5:
print(f"قيمة x الحالية هي {x}")
x = x + 1 # نزيد قيمة x في كل دورة
print("انتهت الحلقة.")
هنا، بعد 5 دورات، ستصبح قيمة x مساوية لـ 5، والشرط x < 5 سيصبح False، فتتوقف الحلقة. تذكر دائماً أن تتأكد من أن هناك شيئاً ما داخل الحلقة يغير حالة الشرط.
3. متى تختار for ومتى تختار while؟
الآن بعد أن رأيت كلتا الحلقتين، قد تتساءل متى تستخدم أياً منهما. إليك قاعدة بسيطة لمساعدتك:
- استخدم
for: عندما تريد المرور على كل عنصر في مجموعة محددة (قائمة، سلسلة نصية،range). أنت تعرف مسبقاً "حجم" التكرار. - استخدم
while: عندما تريد التكرار طالما أن شرطاً معيناً لا يزال صحيحاً. أنت لا تعرف بالضرورة عدد المرات التي ستعمل فيها الحلقة.
هذا المخطط الانسيابي يوضح الفرق في طريقة التفكير لكل حلقة:

اختبر فهمك!
لديك قائمتان: قائمة بالمهام وقائمة فارغة للمهام المكتملة.tasks_todo = ["غسل الصحون", "ترتيب الغرفة", "إخراج القمامة"]tasks_done = []
اكتب برنامجاً يستخدم حلقة while ليقوم بالآتي:
- في كل دورة، يأخذ أول مهمة من قائمة
tasks_todo. - يطبع رسالة تقول "جاري تنفيذ: [اسم المهمة]".
- ينقل المهمة من
tasks_todoإلىtasks_done. - يجب أن تتوقف الحلقة عندما تصبح قائمة
tasks_todoفارغة.
تلميح: يمكنك استخدام tasks_todo.pop(0) لأخذ وإزالة أول عنصر من القائمة، و tasks_done.append(item) لإضافة عنصر إلى القائمة الأخرى. الشرط في حلقة while يمكن أن يتحقق من طول القائمة len(tasks_todo).
أظهر الحل
tasks_todo = ["غسل الصحون", "ترتيب الغرفة", "إخراج القمامة"]
tasks_done = []
# استمر في العمل طالما أن هناك مهام في قائمة 'للقيام بها'
while len(tasks_todo) > 0:
# خذ أول مهمة من القائمة
current_task = tasks_todo.pop(0)
# اطبع ما تفعله
print(f"جاري تنفيذ: {current_task}")
# أضف المهمة إلى قائمة 'المنجزة'
tasks_done.append(current_task)
print("\nاكتملت جميع المهام!")
print(f"المهام المنجزة: {tasks_done}")
print(f"المهام المتبقية: {tasks_todo}")
الناتج المتوقع:
جاري تنفيذ: غسل الصحون
جاري تنفيذ: ترتيب الغرفة
جاري تنفيذ: إخراج القمامة
اكتملت جميع المهام!
المهام المنجزة: ['غسل الصحون', 'ترتيب الغرفة', 'إخراج القمامة']
المهام المتبقية: []
هذا المثال يوضح استخدام while بشكل جيد، لأننا نواصل العمل "طالما" أن قائمة المهام ليست فارغة.
ملخص الدرس
عمل رائع! لقد أتقنت اليوم واحدة من أهم ركائز البرمجة. لنتذكر ما تعلمناه:
- الحلقات التكرارية تسمح لنا بتنفيذ نفس الكود عدة مرات دون الحاجة إلى كتابته مراراً وتكراراً.
- حلقة
forمثالية للمرور على جميع عناصر مجموعة معروفة (مثل قائمة) أو لتكرار الكود لعدد محدد من المرات باستخدامrange(). - حلقة
whileمثالية للتكرار طالما أن شرطاً معيناً يظل صحيحاً، خاصة عندما لا نعرف عدد التكرارات مسبقاً. - يجب الانتباه لتجنب الحلقات اللانهائية عند استخدام
whileعن طريق التأكد من أن الشرط سيتغير في النهاية.
ما التالي؟
حتى الآن، تعلمنا كتابة أوامر متسلسلة، واتخاذ قرارات (if)، وتكرار العمليات (for/while). أصبح الكود الذي نكتبه أكثر قوة، ولكنه قد يصبح طويلاً وغير منظم. في الدرس القادم، سنتعلم عن الدوال (Functions)، وهي طريقة لتجميع الكود في كتل قابلة لإعادة الاستخدام، مما يجعل برامجنا أكثر تنظيماً وسهولة في القراءة والصيانة.