نستفيد من البرامج الحاسوبية خيرَ استفادة في أتمتة المهام وإجراء المهام التكرارية لكيلا نحتاج إلى القيام بها يدويًا، وإحدى طرائق تكرار المهام المتشابهة هي استخدام حلقات التكرار، وسنشرح في درسنا هذا حلقة تكرار while.
حلفة تكرار while
تؤدي إلى تكرار تنفيذ قسم من الشيفرة بناءً على متغير منطقي (boolean)، وسيستمر تنفيذ هذه الشيفرة لطالما كانت نتيجة التعبير المستعمل معها تساوي true
.
يمكنك أن تتخيل أنَّ حلقة while
هي عبارة شريطة تكرارية، فبعد انتهاء تنفيذ العبارة الشرطية if
فيُستَكمَل تنفيذ بقية البرنامج، لكن مع حلقة while
فسيعود تنفيذ البرنامج إلى بداية الحلقة بعد انتهاء تنفيذها إلى أن يصبح الشرط مساويًا للقيمة false
.
وعلى النقيض من حلقات for التي تُنفَّذ عدد معيّن من المرات، فسيستمر تنفيذ حلقات while
اعتمادًا على شرطٍ معيّن، لذا لن تحتاج إلى عدد مرات تنفيذ الحلقة قبل إنشائها.
حلقة while
الشكل العام لحلقات while
في لغة بايثون كالآتي:
while [a condition is True]: [do something]
سيستمر تنفيذ التعليمات البرمجية الموجودة داخل الحلقة إلى أن يصبح الشرط false
.
لنُنشِئ برنامجًا صغيرًا فيه حلقة while
، ففي هذه البرنامج سنطلب من المستخدم إدخال كلمة مرور. وهنالك خياران أمام حلقة التكرار:
- إما أن تكون كلمة المرور صحيحة، فعندها سينتهي تنفيذ حلقة while
.
- أو أن تكون كلمة المرور غير صحيحة، فعندها سيستمر تنفيذ حلقة التكرار.
لنُنشِئ ملفًا باسم password.py
في محررنا النصي المفضَّل، ولنبدأ بتهيئة المتغير paasword
بإسناد سلسلة نصية فارغة إليه:
password = ''
نستخدم المتغير السابق للحصول على مدخلات المستخدم داخل حلقة التكرار while
.
علينا بعد ذلك إنشاء حلقة while
مع تحديد ما هو الشرط الذي يجب تحقيقه:
password = ''
while password != 'password':
أتبَعنا –في المثال السابق– الكلمة المحجوزة while
بالمتغير password
، ثم سنتحقق إذا كانت قيمة المتغير password
تساوي السلسلة النصية 'password'
(لا تنسَ أنَّ قيمة المتغير سنحصل عليها من مدخلات المستخدم)، يمكنك أن تختار أي سلسلة نصية تشاء لمقارنة مدخلات المستخدم بها.
هذا يعني أنَّه لو أدخل المستخدم السلسلة النصية password
فستتوقف حلقة التكرار وسيُكمَل تنفيذ البرنامج وستُنفَّذ أيّة شيفرات خارج الحلقة، لكن إذا أدخل المستخدم أيّة سلسلة نصية لا تساوي password
فسيُكمَل تنفيذ الحلقة.
علينا بعد ذلك إضافة الشيفرة المسؤولة عمّا يحدث داخل حلقة while
:
password = ''
while password != 'password':
print('What is the password?')
password = input()
نفَّذ البرنامج عبارة print
داخل حلقة while
والتي تسأل المستخدم عن كلمة مروره، ثم أسندنا قيمة مدخلات المستخدم (التي حصلنا عليها عبر الدالة input()
) إلى المتغير password
.
سيتحقق البرنامج إذا كانت قيمة المتغير password
تساوي السلسلة النصية 'password'
، وإذا تحقق ذلك فسينتهي تنفيذ حلقة while
. لنضف سطرًا آخر إلى البرنامج لنعرف ماذا يحدث إن أصبحت قيمة الشرط مساويةً إلى false
:
password = ''
while password != 'password':
print('What is the password?')
password = input()
print('Yes, the password is ' + password + '. You may enter.')
لاحظ أنَّ آخر عبارة print()
موجودة خارج حلقة while
، لذا عندما يُدخِل المستخدم الكلمة password
عند سؤاله عن كلمة مروره، فستُطبَع آخر جملة والتي تقع خارج حلقة التكرار.
لكن ماذا يحدث لو لم يدخل المستخدم الكلمة password
قط؟ حيث لن يستمر تنفيذ البرنامج ولن يروا آخر عبارة print()
وسيستمر تنفيذ حلقة التكرار إلى ما لا نهاية!
يستمر تنفيذ حلقة التكرار إلى ما لا نهاية إذا بقي تنفيذ البرنامج داخل حلقة تكرار دون الخروج منها. وإذا أردتَ الخروج من حلقة تكرار نهائية، فاضغط Ctrl+C
في سطر الأوامر.
احفظ البرنامج ثم شغِّله:
python password.py
سيُطلَب منك إدخال كلمة المرور، ويمكنك تجربة ما تشاء من الكلمات. هذا مثالٌ عن ناتج البرنامج:
What is the password?
hello
What is the password?
sammy
What is the password?
PASSWORD
What is the password?
password
Yes, the password is password. You may enter.
أبقِ في ذهنك أنَّ السلاسل النصية حساسة لحالة الأحرف إلا إذا استعملتَ دالةً من دوال النصوص لتحويل السلسلة النصية إلى حالة الأحرف الصغيرة (على سبيل المثال) قبل التحقق منها.
مثال عن برنامج يستخدم حلقة while
بعد أن تعلمنا المبدأ الأساسي لحلقة تكرار while
، فلنُنشِئ لعبة تعمل على سطر الأوامر لتخمين الأرقام والتي تستعمل الحلقة while
.
نريد من الحاسوب أن يُنشِئ أرقامًا عشوائيةً لكي يحاول المستخدمون تخمينها، لذا علينا استيراد الوحدة random
عبر استخدام العبارة import
، وإذا لم تكن هذه الحزمة مألوفةً لك فيمكنك قراءة المزيد من المعلومات عن توليد الأرقام العشوائية في توثيق بايثون. لنُنشِئ بدايةً ملفًا باسم guess.py
في محررك النصي المفضَّل:
import random
علينا الآن إسناد عدد صحيح عشوائي إلى المتغير number
، ولنجعل مجاله من 1 إلى 25 (بما فيها تلك الأرقام) كيلا نجعل اللعبة صعبة جدًا.
import random
number = random.randint(1, 25)
يمكننا الآن إنشاء حلقة while
، وذلك بتهيئة متغير ثم كتابة الحلقة:
import random
number = random.randint(1, 25)
number_of_guesses = 0
while number_of_guesses < 5:
print('Guess a number between 1 and 25:')
guess = input()
guess = int(guess)
number_of_guesses = number_of_guesses + 1
if guess == number:
break
هيئنا متغيرًا اسمه number_of_guesses
قيمته 0
، وسوف نزيد قيمته عند كل تكرار للحلقة لكي لا تصبح حلقتنا لا نهائية. ثم سنضيف تعبير while
الذي يشترط ألّا تزيد قيمة المتغير number_of_guesses
عن 5. وبعد المحاولة الخامسة سيُعاد المستخدم إلى سطر الأوامر، وإذا حاول المستخدم إدخال أيّ شيء غير رقمي فسيحصل على رسالة خطأ.
أضفنا داخل حلقة while
عبارة print()
لطلب إدخال رقم من المستخدم، ثم سنأخذ مدخلات المستخدم عبر الدالة input()
ونُسنِدَها إلى المتغير guess
، ثم سنحوِّل المتغير guess
من سلسلة نصية إلى عدد صحيح.
وقبل انتهاء حلقة التكرار، فعلينا زيادة قيمة المتغير number_of_guesses
بمقدار 1، لكيلا تُنفَّذ حلقة التكرار أكثر من 5 مرات.
وفي النهاية، كتبنا عبارة if
شرطية لنرى إذا كان المتغير guess
الذي أدخله المستخدم مساوٍ للرقم الموجود في المتغير number
الذي ولَّده الحاسوب، وإذا تحقق الشرط فسنستخدم عبارة break
للخروج من الحلقة.
أصبح البرنامج جاهزًا للاستخدام، ويمكننا تشغيله عبر تنفيذ الأمر:
python guess.py
صحيحٌ أنَّ البرنامج يعمل عملًا سليمًا، لكن المستخدم لن يعلم إذا كان تخمينه صحيحًا ويمكنه أن يخمِّن الرقم خمس مرات دون أن يعلم إذا كانت إحدى محاولاته صحيحة. هذا مثال عن مخرجات البرنامج:
Guess a number between 1 and 25:
11
Guess a number between 1 and 25:
19
Guess a number between 1 and 25:
22
Guess a number between 1 and 25:
3
Guess a number between 1 and 25:
8
لنضف بعض العبارات الشرطية خارج حلقة التكرار لكي يحصل المستخدم على معلومات فيما إذا استطاعوا تخمين الرقم أم لا، وسنضيف هذه العبارات في نهاية الملف:
import random
number = random.randint(1, 25)
number_of_guesses = 0
while number_of_guesses < 5:
print('Guess a number between 1 and 25:')
guess = input()
guess = int(guess)
number_of_guesses = number_of_guesses + 1
if guess == number:
break
if guess == number:
print('You guessed the number in ' + str(number_of_guesses) + ' tries!')
else:
print('You did not guess the number. The number was ' + str(number))
في هذه المرحلة سيُخبِر البرنامجُ المستخدمَ إذا استطاعوا تخمين الرقم، لكن ذلك لن يحدث إلا بعد انتهاء حلقة التكرار وبعد انتهاء عدد مرات التخمين المسموحة.
ولمساعد المستخدم قليلًا، فلنضف بعض العبارات الشرطية داخل حلقة while
وتلك العبارات ستخبر المستخدم إذا كان تخمينه أعلى من الرقم أو أصغر منه، لكي يستطيعوا تخمين الرقم بنجاح، وسنضيف تلك العبارات الشرطية قبل السطر الذي يحتوي على if guess == number
:
import random
number = random.randint(1, 25)
number_of_guesses = 0
while number_of_guesses < 5:
print('Guess a number between 1 and 25:')
guess = input()
guess = int(guess)
number_of_guesses = number_of_guesses + 1
if guess < number:
print('Your guess is too low')
if guess > number:
print('Your guess is too high')
if guess == number:
break
if guess == number:
print('You guessed the number in ' + str(number_of_guesses) + ' tries!')
else:
print('You did not guess the number. The number was ' + str(number))
وعندما نُشغِّل البرنامج مرةً أخرى بتنفيذ python guess.py
، فيمكننا ملاحظة أنَّ المستخدم سيحصل على بعض المساعدة، فلو كان الرقم المولَّد عشوائيًا هو 12
وكان تخمين المستخدم 18
، فسيُخبره البرنامج أنَّ الرقم الذي خمنه أكبر من الرقم العشوائي، وذلك لكي يستطيع تعديل تخمنيه وفقًا لذلك.
هنالك الكثير من التحسينات التي يمكن إجراؤها على الشيفرة السابقة، مثل تضمين آلية لمعالجة الأخطاء التي تحدث عندما لا يُدخِل المستخدم عددًا صحيحًا، لكن كان غرضنا هو رؤية كيفية استخدام حلقة while
في برنامج قصير ومفيد يعمل من سطر الأوامر.
الخلاصة
شرحنا في هذا الدرس كيف تعمل حلقات while
في بايثون وكيفية إنشائها. حيث تستمر حلقات while
بتنفيذ مجموعة من الأسطر البرمجية لطالما كان الشرط مساويًا للقيمة true
.
هذه المقالة جزء من سلسة مقالات حول تعلم البرمجة في بايثون 3.
ترجمة –وبتصرّف– للمقال How To Construct While Loops in Python 3 لصاحبته Lisa Tagliaferri
أفضل التعليقات
لا توجد أية تعليقات بعد
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.