في بايثون، تتيح لك عبارة break الخروج من حلقة برمجية قبل أوانها، مع نقل التحكم إلى الشيفرة التي تلي الحلقة. يرشدك هذا الدرس إلى كيفية استخدام break في حلقتي for وwhile. ستستكشف أيضًا بإيجاز الكلمة المفتاحية continue، التي تُكمل break بتخطي تكرار الحلقة الحالي.
لاستكشاف استخدام break في بايثون، ستحدد ما إذا كان الطالب بحاجة إلى دروس خصوصية بناءً على عدد درجات الاختبارات التي رسب فيها. بعد ذلك، ستطبع عددًا معينًا من درجات الاختبارات وتحسب عدد الطلاب الذين رسبوا في اختبار واحد على الأقل.
ستقوم أيضًا بانحراف قصير عن هذا السيناريو الرئيسي لفحص كيفية استخدام عبارات break لقبول ومعالجة إدخال المستخدم، باستخدام لعبة تخمين الأرقام.
مقدمة عن عبارة break
قبل الانتقال إلى الأمثلة الرئيسية، إليك شرحًا أساسيًا لماهية عبارة break وما وظيفتها. إنها كلمة مفتاحية في بايثون، وعند استخدامها في حلقة برمجية، تُخرج الحلقة فورًا وتنقل التحكم إلى الكود الذي يُنفذ عادةً بعد انتهاء الحلقة.
يمكنك الاطلاع على أساسيات عبارة break في مثال بسيط. يوضح الكود التالي حلقةً تطبع الأرقام ضمن نطاق معين حتى يصبح الرقم التالي أكبر من 5:
>>> for number in range(10):
... if number == 5:
... break
... print(number)
...
0
1
2
3
4
يتكون هذا المثال المختصر من حلقة for التي تتكرر على نطاق من الأرقام من 0 إلى 9. تطبع الحلقة كل رقم، ولكن عندما يكون الرقم التالي 5، تُنهي عبارة break الحلقة مبكرًا. لذا، سيطبع هذا الكود الأرقام من 0 إلى 4، ثم تنتهي الحلقة.
بما أن عبارات break تُنهي الحلقات مبكرًا، فمن غير المنطقي استخدامها في أي سياق لا يتضمن حلقة. في الواقع، سيُثير بايثون خطأً نحويًا إذا حاولت استخدام عبارة break خارج الحلقة.
من أهم فوائد استخدام عبارات break إمكانية منع تكرارات الحلقة غير الضرورية بالخروج مبكرًا عند الحاجة. ستشاهد هذا عمليًا في القسم التالي.
الخروج من حلقة بعدد محدد من التكرارات
تخيل أنك مُعلّم تُقيّم درجات طلابك. بناءً على هذه الدرجات، تريد تحديد عدد الاختبارات التي رسب فيها كل طالب. يوضح المثال التالي كيفية إنجاز هذه المهمة باستخدام حلقة for لتكرار درجات اختبارات الطلاب:
>>> scores = [90, 30, 50, 70, 85, 35]
>>> num_failed_scores = 0
>>> pass_score = 60
>>> for score in scores:
... if score < pass_score:
... num_failed_scores += 1
...
>>> print(f"Number of failed tests: {num_failed_scores}")
Number of failed tests: 3
تبدأ بقائمة درجات طالب واحد. قبل تشغيل الحلقة، تُعيّن بعض المتغيرات. المتغير num_failed_scores مُعيّن على 0، لأنك لم تعثر على أي درجات رسوب حتى الآن. المتغير pass_score، الذي يُخزّن حدّ النجاح في الاختبار، مُعيّن على 60، لذا تُعتبر أي درجة أقل من ذلك رسوبًا في الاختبار.
عند بدء حلقة for، سيتم تشغيلها بعدد الدرجات في القائمة، مع تكرار كل درجة. إذا كانت الدرجة أقل من حدّ الرسوب، فسيتم زيادة قيمة المتغير num_failed_scores بمقدار 1. وأخيرًا، سيتم إخراج عدد الاختبارات التي رسب فيها الطالب.
لدعم الطلاب ذوي الأداء الضعيف، قررتَ تطبيق نظام دروس خصوصية. بعد رسوب الطالب في اختبارين، اقترح عليه دروسًا خصوصية. في هذه الحالة، لن تحتاج إلى تكرار جميع الدرجات. بمجرد رسوب الطالب في اختبارين، ستحصل على المعلومات اللازمة ويمكنك إيقاف التكرار. إليك كيف سيبدو الكود المعدّل في هذه الحالة، باستخدام جملة break:
>>> scores = [90, 30, 50, 70, 85, 35]
>>> num_failed_scores = 0
>>> pass_score = 60
>>> needs_tutoring = "No"
>>> for score in scores:
... if score < pass_score:
... num_failed_scores += 1
... if num_failed_scores >= 2:
... needs_tutoring = "Yes"
... break
...
>>> print(f"Does the student need tutoring? {needs_tutoring}")
Does the student need tutoring? Yes
كما في السابق، تبدأ بقائمة درجات لطالب واحد. قبل تشغيل الحلقة، تُعيّن بعض المتغيرات. الكود متشابه تقريبًا، ولكن مع بعض الإضافات. قبل تشغيل الحلقة، تُضيف متغيرًا جديدًا، needs_tutoring، والذي يكون مُعيّنًا في البداية على “No” لأنك لم تُوصِ بدروس خصوصية لهذا الطالب بعد.
ستستمر في تكرار النتائج وزيادة قيمة متغير num_failed_scores إذا وجدت الحلقة نتيجة اختبار فاشلة. بعد ذلك، في خطوة جديدة، بعد التحقق من كل نتيجة، ستتحقق الحلقة من وجود نتيجتين فاشلتين على الأقل. في هذه الحالة، يُعيّن الكود متغير needs_tutoring إلى “Yes”، وتنتهي الحلقة مبكرًا باستخدام عبارة break. أخيرًا، يعرض الكود رسالة تُشير إلى ما إذا كان الطالب بحاجة إلى دروس خصوصية أم لا.
حتى الآن، رأيتَ استخدام جملة break مع حلقات for. كما سترى في القسم التالي، يمكنكَ أيضًا استخدامها مع حلقات while.
استخدام عبارة break في Python لمعالجة إدخال المستخدم
عند الحاجة إلى الحصول على مُدخلات من مستخدم، ستستخدم غالبًا حلقة برمجية، ولكنك لن تعرف دائمًا عدد التكرارات التي ستحتاجها. في هذه الحالات، تُعدّ حلقة while خيارًا جيدًا، ويمكنك إقرانها بعبارة break لإنهاء الحلقة البرمجية عند الانتهاء من الحصول على مُدخلات المستخدم.
بالانحراف قليلاً عن مثال نتائج اختبارات الطلاب، يمكنك أيضاً رؤية هذا المفهوم مُوضَّحاً في لعبة تخمين الأرقام. في هذه اللعبة، يُمنح اللاعب عدداً محدوداً من الأدوار لتخمين رقم مُولَّد عشوائياً. ستعمل حلقة اللعبة، وهي حلقة while في هذه الحالة، على الأقل بعدد الأدوار، ولكن يُمكن أن تنتهي مُبكراً.
في بداية كل دور، يُطلب من المستخدم إدخال رقم أو رمز إنهاء. إذا خمن اللاعب الرقم بشكل صحيح، تُخرج من حلقة اللعبة وتُهنئه. إذا استنفد اللاعب جميع أدواره دون تخمين الرقم الصحيح، تنتهي حلقة اللعبة ويُخرج الرمز الرقم الصحيح.
إذا قام اللاعب بإدخال حرف الخروج، فسوف تستخدم الحلقة عبارة break للخروج من اللعبة مبكرًا:
>>> import random
>>> guesses_left = 4
>>> random_number = random.randint(1, 10)
>>> while True:
... if guesses_left <= 0:
... print(
... "You ran out of guesses! "
... f"The correct number was {random_number}"
... )
... break
... guess = input("Guess a number between 1 and 10, or enter q to quit: ")
... if guess == "q":
... print("Successfully exited game.")
... break
... elif not (guess.isnumeric()):
... print("Please enter a valid value.")
... elif int(guess) == random_number:
... print("Congratulations, you picked the correct number!")
... break
... else:
... print("Sorry, your guess was incorrect.")
... guesses_left -= 1
... print(f"You have {guesses_left} guesses left.")
...
Guess a number between 1 and 10, or enter q to quit: 5
Sorry, your guess was incorrect.
You have 3 guesses left.
Guess a number between 1 and 10, or enter q to quit: 3
Sorry, your guess was incorrect.
You have 2 guesses left.
Guess a number between 1 and 10, or enter q to quit: 7
Sorry, your guess was incorrect.
You have 1 guesses left.
Guess a number between 1 and 10, or enter q to quit: 2
Sorry, your guess was incorrect.
You have 0 guesses left.
You ran out of guesses! The correct number was 8
في بداية الكود، استورد وحدة “random” للوصول إلى دالة مولد الأرقام العشوائية في بايثون. بعد ذلك، أعددت بعض المتغيرات الرئيسية للعبة. أولًا، أنشئ متغيرًا لتخزين عدد التخمينات المتبقية للاعب. بعد ذلك، أنشئ متغيرًا واحفظ عددًا صحيحًا عشوائيًا، بين 1 و10، باستخدام دالة ()randint في بايثون.
الجزء التالي من الكود هو حلقة اللعبة. تقوم بإعداد حلقة while بشرط True. لذا، ستحتاج إلى جملة break للخروج من الحلقة، وإلا ستستمر الحلقة في العمل إلى أجل غير مسمى.
داخل حلقة اللعبة، تتحقق أولاً من بقاء أي تخمينات لدى اللاعب. إذا لم يتبقَّ أي تخمينات، تطبع رسالة تُعلم اللاعب بعدم وجود تخمينات متبقية وتكشف عن الرقم الصحيح. ثم تستخدم زر “الخروج” للخروج من حلقة اللعبة.
إذا تبقى للاعب تخمينات، فاطلب منه إدخال رقم بين ١ و١٠، أو الحرف q لإنهاء اللعبة. يُخزَّن رد اللاعب في متغير “guess”.
بعد ذلك، تتحقق من استجابة اللاعب باستخدام سلسلة من العبارات الشرطية. إذا أدخل اللاعب الحرف q للخروج من اللعبة، تطبع رسالة تُنبِّه اللاعب بانتهاء اللعبة، ثم تُتبع بجملة break للخروج من حلقة اللعبة.
لتحديد ما إذا كان اللاعب قد أدخل رقمًا، استخدم الدالة .isnumeric(). إذا لم تكن استجابة اللاعب رقمًا، فاطلب منه مرة أخرى إدخال قيمة صحيحة. يُرجى ملاحظة أن هذا التحقق يأتي بعد التأكد من إدخال اللاعب لحرف “إنهاء”، لذا في هذه المرحلة، يجب أن تكون أي استجابات رقمية.
إذا خمن اللاعب الرقم بشكل صحيح، فستُطبع رسالة تهنئة على الشاشة، ثم تُنهي حلقة اللعبة ببيان “break”. أما إذا كان تخمين اللاعب خاطئًا، فستُطبع رسالة تُوضح خطأه. ثم تُطرح تخمينًا واحدًا، وتُطبع العدد المتبقي من التخمينات. عند هذه النقطة، تكون قد وصلت إلى نهاية حلقة التكرار، لذا سيبدأ الكود التكرار التالي.
يُظهر هذا المثال أيضًا ميزةً أخرى وحالة استخدام شائعة لعبارة break. كما رأيت، استخدمتَ عبارة break لمنع تكرار الحلقة إلى ما لا نهاية. يساعد استخدام عبارة break بشكل صحيح على ضمان عدم تكرار الحلقة إلى ما لا نهاية.
إن الجمع بين حلقة while وbreak هو نمط شائع للحصول على إدخال المستخدم، وخاصة في المواقف التي لا تعرف فيها عدد المرات التي ستحتاج فيها إلى تشغيل حلقتك قبل انتهاء المستخدم.
على سبيل المثال، تخيل روبوت محادثة يقدم خدمة عملاء على موقع تجاري. قد يستمر روبوت المحادثة في مطالبة المستخدمين بطرح الأسئلة أو طلب معلومات ذات صلة حتى يتم حل جميع مشاكلهم. يمكن للدردشة استخدام حلقة while تعمل حتى يُشير المستخدمون إلى عدم حاجتهم للمساعدة، وعندها يمكن إنهاء الحلقة باستخدام عبارة break.
الخروج من الحلقات المتداخلة
يمكنك أيضًا استخدام عبارات break للخروج من الحلقات المتداخلة. بهذه الطريقة، تُنهي عبارة break الحلقة المغلقة الداخلية. بالعودة إلى أداة تحليل نتائج اختبارات الطلاب، انظر إلى المثال التالي لتوضيح هذا المبدأ.
في هذا المثال، ستفحص أداتك درجات اختبارات عدة طلاب لتحديد عدد الطلاب الذين حصلوا على درجة رسوب واحدة على الأقل. ستُكرر حلقة خارجية قوائم مختلفة من درجات الطلاب، بينما ستُكرر حلقة داخلية الدرجات الفردية لكل قائمة طلاب.
>>> scores = [
... [90, 30, 80, 100],
... [100, 80, 95, 87],
... [75, 84, 77, 50],
... ]
>>> pass_score = 60
>>> num_failed_students = 0
>>> for student_scores in scores:
... for score in student_scores:
... if score < pass_score:
... num_failed_students += 1
... break
...
>>> print(f"Number of students who failed a test: {num_failed_students}")
Number of students who failed a test: 2
ابدأ بإنشاء قائمة بالنتائج. تحتوي هذه القائمة في الواقع على ثلاث قوائم فرعية منفصلة، كل منها تمثل نتائج اختبار أحد الطلاب.
بعد ذلك، يمكنك إعداد متغيرين صحيحين. أولًا، حدد الحد الأدنى لدرجة الرسوب في الاختبار، وهو 60، كما في مثال الكود السابق. بعد ذلك، حدد العدد الأولي للطلاب الذين رسبوا في الاختبار بـ 0، لأنك لم تعثر على أي درجات رسوب في الاختبار حتى الآن.
بعد ذلك، ابدأ حلقة for الخارجية للكود. ستُكرر هذه الحلقة كل قائمة من قوائم درجات الطلاب الثلاث. داخل هذه الحلقة، أنشئ حلقة for متداخلة تأخذ قائمة درجات طالب واحدة، وتُكرر كل درجة على حدة.
إذا وجدت الحلقة الداخلية نتيجة رسوب، فستزيد عدد الطلاب الراسبين في الاختبار بمقدار 1، ثم تخرج من الحلقة الداخلية لعدم الحاجة للتحقق من بقية درجات الطالب. لاحظ أن عبارة “break” تخرج فقط من الحلقة الداخلية، وسيستمر الكود مع القائمة التالية من درجات الطلاب مع استمرار الحلقة الخارجية.
في نهاية الكود، تقوم بإخراج عدد الطلاب الذين فشلوا في اختبار واحد على الأقل إلى الشاشة.
استخدام continue بدلاً من break
تحتوي بايثون أيضًا على كلمة مفتاحية أخرى تُمكّنك من تقليل عدد تكرارات الحلقة غير الضرورية. تتيح لك كلمة continue تخطي تكرارات مُحددة للحلقة عند استيفاء الشروط المُحددة. إذا استوفى تكرار ما الشروط المُحددة، فستتخطى الحلقة هذا التكرار وتنتقل إلى التكرار التالي.
على سبيل المثال، لنفترض أنك تريد تكرار مجموعة من الأرقام وطباعة الأرقام الفردية فقط. يمكنك كتابة شيفرة برمجية باستخدام الكلمة المفتاحية continue، كما في المثال التالي:
>>> for index in range(6):
... if index % 2 == 0:
... continue
... print(index)
...
1
3
5
سيطبع هذا المثال الأرقام ١ و٣ و٥. ستُنشئ حلقة تكرارية (for loop) على نطاق الأرقام من ١ إلى ٦. داخل الحلقة، ستستخدم مُعامل modulo للتحقق من كل رقم في النطاق. إذا كان باقي الرقم مقسومًا على ٢ يساوي ٠، فسيكون الرقم زوجيًا، لذا ستنتقل إلى continue. تُنهي continue تكرار الحلقة، ولن يُنفَّذ الكود بعد continue.
مع ذلك، إذا لم يكن باقي العدد مقسومًا على ٢ مساويًا لـ ٠ (يجب أن يكون ١ للأعداد الفردية)، فلن يُنفِّذ الكود عبارة الاستمرار. بل سيطبع العدد.
تتشابه كلمتا break وcontinue في أنهما تُنهيان تكرار الحلقة الحالي. مع ذلك، بينما تُنهي break الحلقة الداخلية تمامًا، وتُنهي أي تكرارات أخرى، فإن continue تتخطى بقية التكرار الحالي وتنتقل إلى التكرار التالي. كلتا الكلمتين المفتاحيتين أدوات قيّمة لإنهاء تكرار الحلقة مبكرًا عند الضرورة.
استخدام break مع جملة else
تحتوي حلقات for وwhile في بايثون على شرط else. هذه ميزة غير مألوفة، لا توجد في العديد من لغات البرمجة الأخرى. يُفعّل شرط else إذا لم يتم تنفيذ جملة break داخل الحلقة.
الاستخدام الرئيسي لشرط else هو تجنب المتغيرات التي تُسجل فقط ما إذا كنت تستخدم break لإنهاء حلقة. على سبيل المثال، يمكنك إعادة كتابة مثال الإرشاد السابق باستخدام شرط else في حلقة for:
>>> scores = [90, 30, 50, 70, 85, 35]
>>> num_failed_scores = 0
>>> pass_score = 60
>>> for score in scores:
... if score < pass_score:
... num_failed_scores += 1
... if num_failed_scores >= 2:
... print("The student needs tutoring")
... break
... else:
... print("The student doesn't need tutoring")
...
The student needs tutoring
لاحظ أن else لديها مسافات لتتوافق مع for. تُفعَّل عبارة break إذا احتاج الطالب إلى دروس خصوصية. في هذه الحالة، يتم تجاهل عبارة else. إذا اكتملت الحلقة دون الضغط على break، فسيتم تنفيذ الكود الموجود أسفل else.
في هذا المثال، لا تحتاج إلى متغير needs_tutoring من السابق لأنك تستخدم ميزات تدفق التحكم في Python بدلاً من ذلك.
يمكنك أيضًا استخدام break و else للخروج تمامًا من حلقات for المتداخلة. راجع المثال مع عدة طلاب. لنفترض أنك مهتم فقط بمعرفة ما إذا كان أيٌّ منهم قد رسب في اختبار واحد على الأقل. يمكنك استخدام الكود التالي:
>>> scores = [
... [90, 30, 80, 100],
... [100, 80, 95, 87],
... [75, 84, 77, 50],
... ]
>>> pass_score = 60
>>> for student_scores in scores:
... for score in student_scores:
... if score < pass_score:
... print("At least one student failed a test")
... break
... else:
... continue
... break
...
At least one student failed a test
هنا تستخدم بناء else … continue … break الذي يسمح لك بالخروج من حلقتي for. إذا خرجت من الحلقة الداخلية، فستضغط على break الثانية لإنهاء الحلقة الخارجية أيضًا. إذا لم تُنفّذ break في الحلقة الداخلية، فإن continue تضمن عدم تنفيذ break في الحلقة الخارجية أيضًا.
هذا البناء مُعقّد بعض الشيء، وغالبًا ما تتوفر خيارات أفضل وأسهل قراءة. في هذا المثال، يُمكنك تسطيح القوائم المتداخلة واستخدام حلقة واحدة لمعالجة النتائج.
في هذا الدرس، استكشفتَ عبارة break في بايثون وتعلمتَ كيفية استخدامها للخروج من الحلقات مبكرًا. شاهدتَ مثالًا لأداة تحليل نتائج اختبارات الطلاب، والتي توضح كيفية منع استمرار الحلقة بعد تحقيق النتائج المرجوة، بالإضافة إلى كيفية الخروج من حلقة متداخلة.
من خلال مثال لعبة تخمين الأرقام، تعلمتَ أيضًا كيفية استخدام عبارات break لاستيعاب مُدخلات المستخدم ومعالجتها. ثم ألقيتَ نظرة سريعة على عبارة continue، وهي كلمة مفتاحية مشابهة تُتيح لك تخطي تكرار واحد من حلقة التكرار.
إن فهم عبارات التوقف وكيفية إنهاء الحلقات مبكرًا يعد مهارة أساسية في Python، حيث يساعدك على كتابة كود أكثر كفاءة عن طريق تقليل التكرارات غير الضرورية ومنع الحلقات اللانهائية التي تسبب المشاكل.
اكتشاف المزيد من بايثون العربي
اشترك للحصول على أحدث التدوينات المرسلة إلى بريدك الإلكتروني.