تتيح لك حلقة while في بايثون تنفيذ كتلة من التعليمات البرمجية بشكل متكرر طالما ظل شرط معين صحيحًا. على عكس حلقات for التي تتكرر لعدد معروف من المرات، تُعد حلقات while مثالية للحالات التي لا يكون فيها عدد التكرارات معروفًا مسبقًا.
تعتبر الحلقات بنية مفيدة جدًا في Python، لذا فإن تعلم كيفية كتابتها واستخدامها يعد مهارة رائعة بالنسبة لك كمطور Python.
البدء باستخدام حلقات while في بايثون
في البرمجة، الحلقات هي عبارات تحكم تسمح بتكرار مجموعة معينة من العمليات عدة مرات. عمليًا، ستجد نوعين رئيسيين من الحلقات:
- تُستخدم حلقات for في الغالب لتكرار عدد معروف من المرات، وهو أمر شائع عند معالجة مجموعات البيانات التي تحتوي على عدد محدد من عناصر البيانات.
- تُستخدم حلقات while عادةً لتكرار عدد غير معروف من المرات، وهو أمر مفيد عندما يعتمد عدد التكرارات على شرط معين.
تحتوي بايثون على هاتين الحلقتين، وفي هذا الدرس، ستتعلم عن حلقات while. في بايثون، ستستخدمها عادةً عند الحاجة إلى تكرار سلسلة من المهام لعدد غير محدد من المرات.
حلقات while في بايثون هي عبارات مركبة ذات رأس وكتلة شيفرة، تُنفذ حتى يصبح الشرط خاطئًا. يوضح الشكل الأساسي لحلقة while أدناه:
while condition:
<body>
في هذا التركيب النحوي، الشرط هو تعبير تُقيّمه الحلقة لمعرفة قيمته الحقيقية. إذا كان الشرط صحيحًا، فسيتم تشغيل نص الحلقة. وإلا، تنتهي الحلقة. تجدر الإشارة إلى أن نص الحلقة يمكن أن يتكون من جملة واحدة أو أكثر، ويجب ضبط مسافاتها بشكل صحيح.
فيما يلي تفصيل أكثر لهذا النحو:
whileهي الكلمة الأساسية التي تبدأ رأس الحلقة.conditionهو تعبير تم تقييمه للتحقق من صحته والذي يحدد شرط الخروج.- يتكون
<body>من جملة واحدة أو أكثر يتم تنفيذها في كل تكرار.
فيما يلي مثال سريع لكيفية استخدام حلقة while للتكرار عبر تسلسل متناقص من الأرقام:
>>> number = 5
>>> while number > 0:
... print(number)
... number -= 1
...
5
4
3
2
1
في هذا المثال، الشرط في الحلقة هو number > 0. إذا أرجع هذا الشرط قيمة خاطئة، تنتهي الحلقة. يتكون نص الحلقة من استدعاء دالة ()print لعرض القيمة على الشاشة. بعد ذلك، تُنقص قيمة number. سيؤدي هذا التغيير إلى نتيجة مختلفة عند تقييم الحلقة للشرط في التكرار التالي.
تعمل الحلقة طالما بقي الشرط صحيحًا. عندما يصبح الشرط خاطئًا، تنتهي الحلقة، وينتقل تنفيذ البرنامج إلى أول جملة بعد نص الحلقة. في هذا المثال، تنتهي الحلقة عندما يصل العدد إلى قيمة أقل من أو تساوي 0.
إذا لم يصبح شرط الحلقة خاطئًا، فسيكون لديك حلقة لا نهائية محتملة. تأمل الحلقة التالية، واضغط على مفتاحي Ctrl+C لإنهاء تنفيذها:
>>> number = 5
>>> while number != 0:
... print(number)
... number -= 1
...
5
4
3
2
1
>>> number = 5
>>> while number != 0:
... print(number)
... number -= 2
...
5
3
1
-1
-3
-5
-7
-9
-11
Traceback (most recent call last):
...
KeyboardInterrupt
في هذا المثال، شرط الحلقة هو number != 0. يعمل هذا الشرط عند تقليل number بمقدار 1. مع ذلك، إذا قلّلته بمقدار 2، فقد لا يصبح الشرط خاطئًا أبدًا، مما قد يؤدي إلى حلقة لا نهائية. في مثل هذه الحالات، يمكنك عادةً إنهاء الحلقة بالضغط على Ctrl+C، مما يؤدي إلى ظهور استثناء KeyboardInterrupt في معظم أنظمة التشغيل.
لاحظ أن حلقة while تتحقق من حالتها أولًا قبل أي شيء آخر. إذا كانت خاطئة في البداية، فلن يتم تشغيل نص الحلقة أبدًا:
>>> number = 0
>>> while number > 0:
... print(number)
... number -= 1
...
في هذا المثال، عندما تجد الحلقة أن number ليس أكبر من 0، تُنهي التنفيذ فورًا دون الدخول إلى نص الحلقة. لذا، لا يُنفَّذ النص أبدًا.
بعد أن تعرفتَ على أساسيات بناء جملة حلقات while، حان الوقت للتعمق في بعض الأمثلة العملية في بايثون. في القسم التالي، ستتعرف على كيفية تطبيق هذه الحلقات في مواقف واقعية.
استخدام صيغة حلقة while المتقدمة
تتميز حلقة while في بايثون ببعض الميزات المتقدمة التي تجعلها مرنة وقوية. يمكن أن تكون هذه الميزات مفيدة عند الحاجة إلى ضبط الحلقة بدقة لتلبية تدفقات تنفيذ محددة.
حتى الآن، رأيتَ أمثلةً حيث يتم تشغيل نص الحلقة بالكامل في كل تكرار. يوفر بايثون كلمتين رئيسيتين تسمحان لك بتعديل هذا السلوك:
break: يُنهي الحلقة فورًا. ثم يُستكمل تنفيذ البرنامج مع أول جملة تلي نص الحلقة.continue: يُنهي التكرار الحالي فقط. يعود التنفيذ إلى رأس الحلقة، ويُقيّم شرط الحلقة لتحديد ما إذا كانت الحلقة ستُنفَّذ مرة أخرى.
حلقات while في بايثون لها أيضًا قواعد لغوية إضافية. فهي تحتوي على شرط else يُفعّل عند انتهاء الحلقة تلقائيًا عند تحقق الشرط. في الأقسام التالية، ستتعلم المزيد عن كيفية عمل عبارتي break وcontinue، وكيفية استخدام شرط else بفعالية في حلقات while.
عبارة break: الخروج من الحلقة مبكرًا
باستخدام عبارة break، يمكنك إنهاء تنفيذ حلقة while وجعل برنامجك يستمر بالعبارة الأولى مباشرة بعد نص الحلقة.
فيما يلي نص قصير يوضح كيفية عمل عبارة break:
number = 6
while number > 0:
number -= 1
if number == 2:
break
print(number)
print("Loop ended")
عندما يصبح number 2، يتم الوصول إلى عبارة break، وتنتهي الحلقة تمامًا. ينتقل تنفيذ البرنامج إلى استدعاء ()print في السطر الأخير من البرنامج النصي.
يؤدي تشغيل break.py من سطر الأوامر إلى الناتج التالي:
$ python break.py
5
4
3
Loop ended
تطبع الحلقة القيم بشكل طبيعي. عندما يصل number إلى 2، يتم إيقاف التشغيل، مما يُنهي الحلقة ويُظهر “Loop ended” على الشاشة. لاحظ أن 2٢ و1 لا يُطبعان إطلاقًا.
من المهم ملاحظة أنه من غير المنطقي استخدام عبارات break خارج الجمل الشرطية. لنفترض أنك أدرجت عبارة break مباشرةً في نص الحلقة دون تضمينها في جملة شرطية. في هذه الحالة، ستنتهي الحلقة في التكرار الأول، وربما دون تشغيل نص الحلقة بأكمله.
عبارة continue: تخطي المهام في التكرار
بعد ذلك، لديك عبارة continue. باستخدام هذه العبارة، يمكنك تخطي بعض المهام في التكرار الحالي عند استيفاء شرط معين.
النص التالي مطابق تقريبًا للنص الموجود في القسم السابق باستثناء عبارة continue بدلاً من break:
number = 6
while number > 0:
number -= 1
if number == 2:
continue
print(number)
print("Loop ended")
يبدو ناتج continue.py مثل هذا:
$ python continue.py
5
4
3
1
0
Loop ended
هذه المرة، عندما يكون number 2، تُنهي عبارة continue هذه التكرار. لهذا السبب، لا يُطبع الرقم 2. يعود عنصر التحكم بعد ذلك إلى رأس الحلقة، حيث يُعاد تقييم الشرط. تستمر الحلقة حتى يصل الرقم إلى 0، وعندها تنتهي كما كانت من قبل.
شرط else: تشغيل المهام عند إنهاء الحلقة الطبيعية
يسمح بايثون بإضافة شرط else اختياري في نهاية حلقات while. الصيغة موضحة أدناه:
while condition:
<body>
else:
<body>
سيتم تنفيذ الكود الموجود تحت شرط else فقط إذا انتهت حلقة while تلقائيًا دون مواجهة عبارة break. بمعنى آخر، سيتم تنفيذه عندما يصبح شرط الحلقة خاطئًا، وعندها فقط.
لاحظ أنه لا جدوى من وجود جملة else في حلقة لا تحتوي على جملة break. في هذه الحالة، سيؤدي وضع محتوى كتلة else بعد الحلقة – بدون مسافة بادئة – إلى نفس النتيجة وسيكون أكثر وضوحًا.
متى يكون استخدام جملة else في حلقة while مفيدًا؟ من الحالات الشائعة لاستخدام جملة else عند الحاجة إلى الخروج من الحلقة. خذ المثال التالي بعين الاعتبار:
import random
import time
MAX_RETRIES = 5
attempts = 0
while attempts < MAX_RETRIES:
attempts += 1
print(f"Attempt {attempts}: Connecting to the server...")
# Simulating a connection scenario
time.sleep(0.3)
if random.choice([False, False, False, True]):
print("Connection successful!")
break
print("Connection failed. Retrying...")
else:
print("All attempts failed. Unable to connect.")
يُحاكي هذا البرنامج النصي عملية الاتصال بخادم خارجي. تتيح لك الحلقة محاولة الاتصال عدة مرات، مُحددة بثابت MAX_RETRIES. في حال نجاح الاتصال، تُنهي عبارة break الحلقة.
عند فشل جميع محاولات الاتصال، يُنفَّذ شرط else، لإعلامك بفشل المحاولات. شغِّل البرنامج النصي عدة مرات للتحقق من النتائج.
كتابة حلقات while فعالة في بايثون
عند كتابة حلقات while في بايثون، تأكد من كفاءتها وسهولة قراءتها. كما يجب التأكد من انتهاءها بشكل صحيح.
عادةً، يُستخدم تكرار while عند الحاجة إلى تكرار سلسلة من الإجراءات حتى يصبح شرط معين خاطئًا أو طالما بقي صحيحًا. هذا النوع من التكرار غير مناسب لمعالجة جميع عناصر كائن قابل للتكرار. في هذه الحالة، يُنصح باستخدام for بدلاً من ذلك.
في الأقسام التالية، ستتعلم كيفية استخدام حلقات while بشكل فعال، وتجنب الحلقات اللانهائية، وتنفيذ عبارات التحكم مثل break وcontinue، والاستفادة من شرط else للتعامل مع إكمال الحلقة بشكل سليم.
تشغيل المهام بناءً على شرط باستخدام حلقات while
من حالات الاستخدام العامة لحلقة while انتظار توفر مورد قبل استخدامه. هذا شائع في سيناريوهات مثل:
- في انتظار إنشاء ملف أو تعبئته
- التحقق مما إذا كان الخادم متصلاً بالإنترنت
- استطلاع قاعدة البيانات حتى يصبح السجل جاهزًا
- التأكد من استجابة واجهة برمجة التطبيقات REST قبل تقديم الطلبات
فيما يلي حلقة تتحقق باستمرار مما إذا كان قد تم إنشاء ملف معين:
import time
from pathlib import Path
filename = Path("hello.txt")
print(f"Waiting for {filename.name} to be created...")
while not filename.exists():
print("File not found. Retrying in 1 second...")
time.sleep(1)
print(f"{filename} found! Proceeding with processing.")
with open(filename, mode="r") as file:
print("File contents:")
print(file.read())
تستخدم الحلقة في هذا البرنامج النصي دالة ().exists على كائن Path. تُرجع هذه الدالة القيمة True إذا خرج الملف المستهدف. ينفي عامل not نتيجة التحقق، ويُرجع القيمة True إذا لم يخرج الملف. في هذه الحالة، تنتظر الحلقة ثانية واحدة لتشغيل تكرار آخر والتحقق من الملف مرة أخرى.
إذا قمت بتشغيل هذا البرنامج النصي، فستحصل على شيء مثل التالي:
$ python check_file.py
Waiting for hello.txt to be created...
File not found. Retrying in 1 second...
File not found. Retrying in 1 second...
File not found. Retrying in 1 second...
...
في هذه الأثناء، يمكنك فتح نافذة طرفية أخرى وإنشاء ملف hello.txt. عندما تعثر الحلقة على الملف المُنشأ حديثًا، ستنتهي. بعد ذلك، سيتم تنفيذ الكود بعد الحلقة، وطباعة محتوى الملف على شاشتك.
استخدام حلقات while لعدد غير معروف من التكرارات
حلقات while مفيدة أيضًا عند معالجة تدفق بيانات بعدد غير معروف من العناصر. في هذه الحالة، لا تعرف عدد التكرارات المطلوبة، لذا يمكنك استخدام حلقة while مع ضبط قيمة True كشرط تحكم. توفر هذه التقنية طريقة بايثونية لكتابة حلقات تُشغّل عددًا غير معروف من التكرارات.
على سبيل المثال، لنفترض أنك بحاجة إلى قراءة مستشعر درجة حرارة يُزوّد بيانات باستمرار. عندما تكون درجة الحرارة مساوية أو أعلى من ٢٨ درجة مئوية، يجب عليك إيقاف مراقبته. إليك حلقة لإنجاز هذه المهمة:
import random
import time
def read_temperature():
return random.uniform(20.0, 30.0)
while True:
temperature = read_temperature()
print(f"Temperature: {temperature:.2f}°C")
if temperature >= 28:
print("Required temperature reached! Stopping monitoring.")
break
time.sleep(1)
في هذه الحلقة، استخدم “True” كشرط للحلقة، مما يُولّد حلقة مستمرة. بعد ذلك، اقرأ مُستشعر درجة الحرارة واطبع قيمة درجة الحرارة الحالية. إذا كانت درجة الحرارة تساوي أو تزيد عن ٢٥ درجة، فانتهِ من الحلقة. وإلا، فانتظر ثانيةً ثم اقرأ المُستشعر مرة أخرى.
إزالة العناصر من عنصر قابل للتكرار في حلقة
قد يكون تعديل مجموعة أثناء التكرار محفوفًا بالمخاطر، خاصةً عند الحاجة إلى إزالة عناصر من المجموعة المستهدفة. في بعض الحالات، قد يكون استخدام حلقة while حلاً جيدًا.
على سبيل المثال، لنفترض أنك بحاجة إلى معالجة قائمة قيم وحذف كل قيمة منها. في هذه الحالة، يمكنك استخدام حلقة while كما يلي:
>>> colors = ["red", "blue", "yellow", "green"]
>>> while colors:
... color = colors.pop(-1)
... print(f"Processing color: {color}")
...
Processing color: green
Processing color: yellow
Processing color: blue
Processing color: red
عند تقييم قائمة في سياق منطقي، ستحصل على قيمة “صحيح” إذا كانت تحتوي على عناصر، وقيمة “خطأ” إذا كانت فارغة. في هذا المثال، تبقى قيمة “colors” صحيحة طالما كانت تحتوي على عناصر. بمجرد إزالة جميع العناصر باستخدام دالة .pop()، تصبح قيمة “ألوان” خاطئة، وتنتهي الحلقة.
الحصول على إدخال المستخدم باستخدام حلقة while
يُعدّ الحصول على مُدخلات المستخدم من سطر الأوامر حالة استخدام شائعة لحلقات while في بايثون. انظر إلى الحلقة التالية التي تأخذ مُدخلات باستخدام ()input المُدمجة. تستمر الحلقة حتى كتابة كلمة “stop”:
line = input("Type some text: ")
while line != "stop":
print(line)
line = input("Type some text: ")
تطلب دالة الإدخال ()input من المستخدم إدخال نص. ثم تُعيِّن النتيجة إلى متغير السطر (line). يتحقق شرط الحلقة من اختلاف محتوى السطر عن “stop”، وفي هذه الحالة، يُنفَّذ نص الحلقة. داخل الحلقة، تُستدعى دالة الإدخال ()input مرة أخرى. تتكرر الحلقة حتى يكتب المستخدم كلمة “stop”.
هذا المثال يعمل، لكن لديه عيبًا يتمثل في تكرار استدعاء دالة ()input دون داعٍ. يمكنك تجنب التكرار باستخدام مُعامل walrus كما هو موضح في مقتطف الكود أدناه:
>>> while (line := input("Type some text: ")) != "stop":
... print(line)
...
Type some text: Python
Python
Type some text: Walrus
Walrus
Type some text: stop
في هذه الحلقة المُحدّثة، ستحصل على مُدخلات المستخدم في مُتغير السطر باستخدام تعبير تعيين. في الوقت نفسه، يُعيد التعبير مُدخلات المستخدم لمقارنتها بقيمة “stop” المُحددة.
عبور المتكررات باستخدام حلقات while
قد يكون استخدام حلقة while مع الدالة ()next المضمنة طريقة رائعة للتحكم الدقيق في عملية التكرار عند العمل مع المتكررات والقابلة للتكرار.
لتوضيح كيفية عمل ذلك، أعد كتابة حلقة for باستخدام حلقة while. انظر إلى الكود التالي:
requests = ["first request", "second request", "third request"]
print("\nWith a for loop")
for request in requests:
print(f"Handling {request}")
print("\nWith a while loop")
it = iter(requests)
while True:
try:
request = next(it)
except StopIteration:
break
print(f"Handling {request}")
الحلقتان متكافئتان. عند تشغيل البرنامج النصي، ستتعامل كل حلقة مع الطلبات الثلاثة بالترتيب:
$ python for_loop.py
With a for-loop
Handling first request
Handling second request
Handling third request
With a while-loop
Handling first request
Handling second request
Handling third request
حلقات for في بايثون مرنة وفعّالة للغاية، ويُفضّل استخدام for بدلاً من while عند الحاجة إلى التكرار على مجموعة مُحددة. مع ذلك، فإن تحويل حلقة for إلى حلقة while، كما ذُكر سابقًا، يمنحك مرونة أكبر في كيفية التعامل مع المُكرّر.
محاكاة حلقات Do-While
حلقة do-while هي عبارة عن بيان تدفق تحكم ينفذ كتلة التعليمات البرمجية الخاصة به مرة واحدة على الأقل، بغض النظر عما إذا كان شرط الحلقة صحيحًا أم خاطئًا.
إذا كنتَ من مُتعلّمي لغات مثل C أو C++ أو Java أو JavaScript، فقد تتساءل أين توجد حلقة do-while في بايثون؟ الخبر السيئ هو أن بايثون لا تحتوي على حلقة. الخبر الجيد هو أنه يُمكنك مُحاكاتها باستخدام حلقة while مع عبارة break.
فكر في المثال التالي، والذي يأخذ إدخال المستخدم في حلقة:
>>> while True:
... number = int(input("Enter a positive number: "))
... print(number)
... if not number > 0:
... break
...
Enter a positive number: 1
1
Enter a positive number: 4
4
Enter a positive number: -1
-1
مرة أخرى، تأخذ هذه الحلقة مُدخلات المستخدم باستخدام دالة الإدخال (()input) المُدمجة. ثم تُحوّل المُدخلات إلى عدد صحيح باستخدام دالة ()int. إذا أدخل المستخدم رقمًا يساوي 0 أو أقل، فسيتم تشغيل عبارة break، وتنتهي الحلقة.
لاحظ أنه لمحاكاة حلقة do-while في بايثون، يُطبّق الشرط الذي يُنهي الحلقة في نهايتها، ويكون نصها عبارة عن جملة break. من المهم أيضًا التأكيد على أنه في هذا النوع من الحلقات، يُنفّذ نصها مرة واحدة على الأقل.
استخدام حلقات while لحلقات الأحداث
من الاستخدامات الشائعة والممتدة لحلقات while في بايثون إنشاء حلقات أحداث، وهي حلقات لا نهائية تنتظر أحداثًا معينة. بمجرد وقوع حدث، تُرسله الحلقة إلى معالج الحدث المناسب.
تتضمن بعض الأمثلة الكلاسيكية للحقول التي ستجد فيها حلقات الأحداث ما يلي:
- أطر عمل واجهة المستخدم الرسومية (GUI)
- تطوير الألعاب
- التطبيقات غير المتزامنة
- عمليات الخادم
على سبيل المثال، لنفترض أنك تريد تطبيق لعبة تخمين أرقام. يمكنك القيام بذلك باستخدام حلقة while:
from random import randint
LOW, HIGH = 1, 10
secret_number = randint(LOW, HIGH)
clue = ""
# Game loop
while True:
guess = input(f"Guess a number between {LOW} and {HIGH} {clue} ")
number = int(guess)
if number > secret_number:
clue = f"(less than {number})"
elif number < secret_number:
clue = f"(greater than {number})"
else:
break
print(f"You guessed it! The secret number is {number}")
في هذا المثال، تُشغّل حلقة اللعبة منطق اللعبة. أولًا، تأخذ تخمين المستخدم باستخدام دالة ()input، وتُحوّله إلى عدد صحيح، ثم تتحقق مما إذا كان أكبر أو أصغر من الرقم السري. تُنفّذ عبارة else عندما يكون تخمين المستخدم مساويًا للرقم السري. في هذه الحالة، تُغلق الحلقة، وتُظهر اللعبة رسالة فوز.
استكشاف حلقات while اللانهائية
أحيانًا، قد تكتب حلقة while لا تنتهي تلقائيًا. تُعرف الحلقة التي تتبع هذا السلوك عادةً باسم الحلقة اللانهائية، مع أن الاسم ليس دقيقًا تمامًا، لأنه في النهاية، سيتعين عليك إنهاء الحلقة بطريقة ما.
يمكنك كتابة حلقة لا نهائية، سواءً عن قصد أو عن غير قصد. الحلقات اللانهائية المقصودة هي أدوات قوية تُستخدم عادةً في البرامج التي تحتاج إلى التشغيل المستمر حتى يتم استيفاء شرط خارجي، مثل حلقات الألعاب، وعمليات الخادم، والتطبيقات التي تعتمد على الأحداث، مثل تطبيقات واجهة المستخدم الرسومية أو الأكواد غير المتزامنة.
في المقابل، غالبًا ما تكون حلقات while اللانهائية غير المقصودة نتيجةً لمشكلة منطقية تمنع شرط الحلقة من أن يصبح خاطئًا. على سبيل المثال، قد يحدث هذا عندما تكون الحلقة:
- فشل في تحديث متغير الشرط
- يستخدم شرطًا معيبًا منطقيًا
في هذه الحالات، تستمر الحلقة في العمل بشكل خاطئ حتى يتم إنهاؤها خارجيًا.
في الأقسام التالية، ستتعلم عن كلا نوعي الحلقات اللانهائية وكيفية التعامل معهما في شيفرتك. للبدء، ستبدأ بالحلقات اللانهائية غير المقصودة.
حلقات لا نهائية غير مقصودة
لنفترض أنك كتبت حلقة while لا تنتهي أبدًا بسبب خطأ داخلي. بالعودة إلى المثال في القسم الأول من هذا البرنامج التعليمي، لديك الحلقة التالية التي تعمل باستمرار:
>>> number = 5
>>> while number != 0:
... print(number)
... number -= 2
...
5
3
1
-1
-3
-5
-7
-9
-11
Traceback (most recent call last):
...
KeyboardInterrupt
لإنهاء هذا الكود، يجب الضغط على Ctrl+C، مما يُقاطع تنفيذ البرنامج من لوحة المفاتيح. وإلا، ستستمر الحلقة إلى ما لا نهاية، لأن شرطها لا يتحول إلى خطأ. في الكود العملي، يُفضل عادةً وجود شرط حلقة مناسب لمنع التنفيذ اللانهائي غير المقصود.
في معظم الحالات مثل هذه، يمكنك منع الحلقة اللانهائية المحتملة عن طريق إصلاح الشرط نفسه أو منطق الحلقة الداخلية للتأكد من أن الشرط يصبح خاطئًا في مرحلة ما أثناء تنفيذ الحلقة.
في المثال أعلاه، يمكنك تعديل الشرط قليلاً لإصلاح المشكلة:
>>> number = 5
>>> while number > 0:
... print(number)
... number -= 2
...
...
5
3
1
هذه المرة، لا تنزل الحلقة إلى القيمة 0. بل تنتهي عندما تكون قيمة الرقم مساوية أو أقل من 0.
بدلاً من ذلك، يمكنك استخدام شروط إضافية في نص الحلقة لإنهاء الحلقة باستخدام break:
>>> number = 5
>>> while number != 0:
... if number <= 0:
... break
... print(number)
... number -= 2
...
5
3
1
هذه الحلقة لها نفس شرطها الأصلي. مع ذلك، تتضمن شرطًا وقائيًا في جسم الحلقة لإنهائها في حال فشل الشرط الرئيسي.
يعتمد حل حلقة لا نهائية غير مقصودة بشكل كبير على المنطق المستخدم في حالة الحلقة وجسمها. لذا، يجب تحليل كل حالة بعناية لتحديد الحل الصحيح.
حلقات لا نهائية مقصودة
حلقات while اللانهائية المتعمدة شائعة ومفيدة. مع ذلك، يتطلب كتابتها بشكل صحيح ضمان شروط خروج مناسبة، وتجنب مشاكل الأداء، ومنع التنفيذ اللانهائي غير المقصود.
على سبيل المثال، قد ترغب في كتابة شيفرة لخدمة تبدأ وتعمل باستمرار، وتستقبل طلبات الخدمة. في هذا السياق، تعني كلمة “إلى الأبد” حتى إيقافها.
الطريقة التقليدية لكتابة حلقة لا نهائية هي استخدام بنية while True. لضمان انتهاء الحلقة تلقائيًا، يجب إضافة جملة break واحدة أو أكثر مُحاطة بشروط مناسبة:
while True:
if condition_1:
break
...
if condition_2:
break
...
if condition_n:
break
يعمل هذا التركيب النحوي بشكل جيد عند وجود عدة أسباب لإنهاء الحلقة. غالبًا ما يكون من الأفضل البدء من عدة مواقع مختلفة بدلًا من محاولة تحديد جميع شروط الإنهاء في رأس الحلقة.
لرؤية هذا البناء عمليًا، ضع في اعتبارك الحلقة اللانهائية التالية التي تطلب من المستخدم تقديم كلمة المرور الخاصة به:
MAX_ATTEMPTS = 3
correct_password = "secret123"
attempts = 0
while True:
password = input("Password: ").strip()
attempts += 1
if password == correct_password:
print("Login successful! Welcome!")
break
if attempts >= MAX_ATTEMPTS:
print("Too many failed attempts.")
break
else:
print(f"Incorrect password. {MAX_ATTEMPTS - attempts} attempts left.")
لهذه الحلقة شرطان للخروج. الشرط الأول يتحقق من صحة كلمة المرور. والشرط الثاني يتحقق من وصول المستخدم إلى الحد الأقصى لعدد محاولات إدخال كلمة مرور صحيحة. يتضمن كلا الشرطين عبارة “break” لإنهاء الحلقة بسلاسة.
لقد تعلمتَ الكثير عن حلقة while في بايثون، وهي بنية تحكم أساسية للتكرار. تعلمتَ كيفية استخدامها لتكرار المهام حتى يتحقق شرط، وكيفية تعديل الحلقات باستخدام عبارات break وcontinue، وكيفية منع أو كتابة حلقات لا نهائية.
يعد فهم حلقات while أمرًا ضروريًا لمطوري Python، لأنها تتيح لك التعامل مع المهام التي تتطلب التنفيذ المتكرر استنادًا إلى الشروط.
تمكنك هذه المعرفة من كتابة كود ديناميكي ومرن، خاصة في المواقف التي يكون فيها عدد التكرارات غير معروف مسبقًا أو يعتمد على شرط واحد أو أكثر.
اكتشاف المزيد من بايثون العربي
اشترك للحصول على أحدث التدوينات المرسلة إلى بريدك الإلكتروني.