Menu
العربية

حلقة while في بايثون: الشرح وتجنّب الحلقات اللانهائية

متى تستخدم حلقة while بدلاً من for، كيف تتجنّب الحلقات اللانهائية، وأهم الأنماط الشائعة التي ستقابلها في الأكواد الحقيقية.

حلقة while في بايثون: التكرار حسب شرط

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

وصيغتها بسيطة:

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

تطبع هذه الحلقة الأرقام من 0 إلى 4. تتحقق بايثون من الشرط في بداية كل دورة، فإذا كان صحيحًا نُفِّذ جسم الحلقة، ثم تُعاد عملية التحقق من جديد. وعندما يصبح الشرط خاطئًا، تنتهي الحلقة.

لاحظ أهمية السطر count += 1، فبدونه سيبقى الشرط صحيحًا إلى ما لا نهاية، وتتحول الحلقة إلى حلقة لانهائية. هذا هو الفخ الأكبر في حلقة while، وهو السبب الرئيسي الذي يجعلنا نفضّل استخدام for كلما أمكن ذلك.

متى تكون حلقة while هي الخيار الأنسب؟

إليك بعض الحالات الكلاسيكية التي تتألق فيها هذه الحلقة:

إعادة المحاولة حتى النجاح.

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

القراءة من المستخدم حتى يختار الخروج.

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

معالجة طابور من البيانات.

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

الخيط المشترك بين هذه الحالات: أنت تراقب تغيّر حالة معيّنة، لا تمرّ على عناصر محددة.

لا مشكلة في استخدام while True

هذا النمط ستصادفه كثيرًا في كود بايثون:

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

هذا هو الأسلوب البايثوني المعتاد عندما يكون شرط الخروج "الحقيقي" موجودًا داخل جسم الحلقة، وليس شيئًا يمكن اختباره بشكل نظيف في البداية. قراءته أسهل من اختراع متغير راية مثل 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.
main.py
Output
Click Run to see the output here.

هذا فحص أولي بسيط للأعداد الأولية. إذا نُفّذت عبارة break الداخلية، فالعدد غير أولي. أما إذا خرجت الحلقة طبيعيًا (أي أصبح الشرط false)، فسيُنفَّذ جزء else ويُعلن أن العدد أولي.

الفرق بين while و for في بايثون: أيهما تختار؟

اختبار ذهني سريع:

  • هل لديك مجموعة عناصر تريد المرور عليها؟ ← استخدم for.
  • هل تحتاج إلى التكرار عددًا محددًا من المرات؟ ← استخدم for i in range(n):.
  • هل تريد التكرار إلى أن يتغيّر شرط معيّن؟ ← استخدم while.

في أغلب شيفرات بايثون التي ستكتبها في البداية، ستجد أن حلقة for تغطي نحو 90% من الحالات. أما حلقة while فتظهر عادةً في سيناريوهات مثل الاستطلاع (polling)، أو إعادة المحاولة، أو بناء مفسّر تفاعلي بسيط (REPL). وإذا وجدت نفسك تستخدم while للمرور على قائمة باستخدام فهرس، فهذه إشارة واضحة إلى أنه عليك التحوّل إلى for مع enumerate.

مثال تطبيقي على حلقة while

لعبة تخمين الأرقام مثال كلاسيكي هنا، لأن عدد مرات التكرار يعتمد على طريقة لعب المستخدم نفسه:

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

لا يمكنك أن تعرف مسبقًا كم عدد المحاولات التي ستلزم — الأمر يعتمد على تخمينات المستخدم. وهذا بالضبط هو السبب الذي وُجدت من أجله حلقة while.

ما الذي ينتظرنا؟

أصبحت الآن مطّلعًا على نوعَي الحلقات اللذين يقدّمهما بايثون. المحطة التالية: شرح range() بالتفصيل، فهي تظهر في أغلب حلقات for التي تعتمد على العدّ، وثمّة تفاصيل دقيقة يستحقّ استيعابها قبل الانتقال إلى التعامل مع المجموعات (collections).

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

متى أستخدم حلقة while بدلاً من حلقة for؟

استخدم while عندما لا تعرف مسبقاً عدد مرات التكرار — مثلاً إعادة المحاولة حتى تنجح عملية ما، أو قراءة إدخال المستخدم حتى يكتب كلمة quit. أمّا for فتناسب المرور على عناصر مجموعة معروفة مسبقاً.

كيف أتجنّب الحلقة اللانهائية في بايثون؟

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

هل استخدام while True يُعتبر ممارسة سيّئة؟

ليس بالضرورة. كتابة while True: مع break واضح في الداخل نمط طبيعي تماماً لفكرة «كرّر حتى نصل إلى شرط خروج محدّد»، وهو أنظف من اختراع متغيّر منطقي (flag) تضطر لإدارته في مكانين.

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

ابدأ الآن