حلقة while في بايثون: التكرار حسب شرط
بينما تمر حلقة for على عناصر تسلسل معروف مسبقًا، تستمر حلقة while في التكرار طالما ظل الشرط محققًا. تلجأ إليها عندما لا تعرف مقدّمًا عدد مرات التكرار المطلوبة، مثل إعادة المحاولة حتى تنجح عملية ما، أو قراءة إدخال المستخدم حتى يطلب التوقف، أو استطلاع خدمة معينة حتى تستجيب.
وصيغتها بسيطة:
تطبع هذه الحلقة الأرقام من 0 إلى 4. تتحقق بايثون من الشرط في بداية كل دورة، فإذا كان صحيحًا نُفِّذ جسم الحلقة، ثم تُعاد عملية التحقق من جديد. وعندما يصبح الشرط خاطئًا، تنتهي الحلقة.
لاحظ أهمية السطر count += 1، فبدونه سيبقى الشرط صحيحًا إلى ما لا نهاية، وتتحول الحلقة إلى حلقة لانهائية. هذا هو الفخ الأكبر في حلقة while، وهو السبب الرئيسي الذي يجعلنا نفضّل استخدام for كلما أمكن ذلك.
متى تكون حلقة while هي الخيار الأنسب؟
إليك بعض الحالات الكلاسيكية التي تتألق فيها هذه الحلقة:
إعادة المحاولة حتى النجاح.
القراءة من المستخدم حتى يختار الخروج.
معالجة طابور من البيانات.
الخيط المشترك بين هذه الحالات: أنت تراقب تغيّر حالة معيّنة، لا تمرّ على عناصر محددة.
لا مشكلة في استخدام while True
هذا النمط ستصادفه كثيرًا في كود بايثون:
هذا هو الأسلوب البايثوني المعتاد عندما يكون شرط الخروج "الحقيقي" موجودًا داخل جسم الحلقة، وليس شيئًا يمكن اختباره بشكل نظيف في البداية. قراءته أسهل من اختراع متغير راية مثل should_continue تحدّثه في مكان وتفحصه في مكان آخر.
القاعدة الوحيدة: تأكد أن هناك break (أو return، أو استثناءً يُرفع) سيصل إليه الكود في نهاية المطاف. فكتابة while True: بدون أي مخرج هي الطريقة الكلاسيكية لتعليق البرنامج بالكامل.
كيفية إيقاف حلقة لانهائية في بايثون
تحدث الحلقة اللانهائية في بايثون عندما يبقى الشرط صحيحًا إلى الأبد. والأسباب الشائعة هي:
- نسيان تحديث المتغير. الحلقة
while count < 5:تحتاج إلى شيء داخل جسمها يغيّر قيمةcount. - تحديث المتغير الخطأ. مثلًا
while i < 10:ثم تكتبj += 1في الداخل، وهذا خطأ يسهل أن يفوتك إذا كان الكود يحتوي على عدة متغيرات. - مقارنة أعداد عشرية. الحلقة
while x != 1.0:قد تدور إلى الأبد إذا كانت قيمةxتقترب من 1.0 دون أن تساويها تمامًا. استخدم<=أوabs(x - 1.0) < toleranceبدلًا من ذلك.
إذا علقت في حلقة لانهائية داخل الطرفية (Terminal)، اضغط Ctrl+C. هذا يُرسل إشارة مقاطعة، فيوقف بايثون ما يفعله فورًا.
break و continue و else في بايثون
تدعم حلقة while نفس أدوات التحكم الثلاث التي تدعمها حلقة for:
breakيخرج من الحلقة فورًا.continueينتقل إلى التكرار التالي مباشرة (فيُعاد فحص الشرط من جديد).elseيُنفَّذ إذا انتهت الحلقة دون أن يُستدعىbreak.
هذا فحص أولي بسيط للأعداد الأولية. إذا نُفّذت عبارة break الداخلية، فالعدد غير أولي. أما إذا خرجت الحلقة طبيعيًا (أي أصبح الشرط false)، فسيُنفَّذ جزء else ويُعلن أن العدد أولي.
الفرق بين while و for في بايثون: أيهما تختار؟
اختبار ذهني سريع:
- هل لديك مجموعة عناصر تريد المرور عليها؟ ← استخدم
for. - هل تحتاج إلى التكرار عددًا محددًا من المرات؟ ← استخدم
for i in range(n):. - هل تريد التكرار إلى أن يتغيّر شرط معيّن؟ ← استخدم
while.
في أغلب شيفرات بايثون التي ستكتبها في البداية، ستجد أن حلقة for تغطي نحو 90% من الحالات. أما حلقة while فتظهر عادةً في سيناريوهات مثل الاستطلاع (polling)، أو إعادة المحاولة، أو بناء مفسّر تفاعلي بسيط (REPL). وإذا وجدت نفسك تستخدم while للمرور على قائمة باستخدام فهرس، فهذه إشارة واضحة إلى أنه عليك التحوّل إلى for مع enumerate.
مثال تطبيقي على حلقة while
لعبة تخمين الأرقام مثال كلاسيكي هنا، لأن عدد مرات التكرار يعتمد على طريقة لعب المستخدم نفسه:
لا يمكنك أن تعرف مسبقًا كم عدد المحاولات التي ستلزم — الأمر يعتمد على تخمينات المستخدم. وهذا بالضبط هو السبب الذي وُجدت من أجله حلقة while.
ما الذي ينتظرنا؟
أصبحت الآن مطّلعًا على نوعَي الحلقات اللذين يقدّمهما بايثون. المحطة التالية: شرح range() بالتفصيل، فهي تظهر في أغلب حلقات for التي تعتمد على العدّ، وثمّة تفاصيل دقيقة يستحقّ استيعابها قبل الانتقال إلى التعامل مع المجموعات (collections).
الأسئلة الشائعة
متى أستخدم حلقة while بدلاً من حلقة for؟
استخدم while عندما لا تعرف مسبقاً عدد مرات التكرار — مثلاً إعادة المحاولة حتى تنجح عملية ما، أو قراءة إدخال المستخدم حتى يكتب كلمة quit. أمّا for فتناسب المرور على عناصر مجموعة معروفة مسبقاً.
كيف أتجنّب الحلقة اللانهائية في بايثون؟
تأكّد أن هناك شيئاً داخل الحلقة يجعل الشرط يصبح False في النهاية. السبب الأكثر شيوعاً للحلقات اللانهائية هو نسيان تحديث المتغيّر الذي يعتمد عليه الشرط. وإذا علقت في واحدة، اضغط Ctrl+C في الطرفية لإيقافها.
هل استخدام while True يُعتبر ممارسة سيّئة؟
while True يُعتبر ممارسة سيّئة؟ليس بالضرورة. كتابة while True: مع break واضح في الداخل نمط طبيعي تماماً لفكرة «كرّر حتى نصل إلى شرط خروج محدّد»، وهو أنظف من اختراع متغيّر منطقي (flag) تضطر لإدارته في مكانين.