الفصل : 7
الجزء : 2
العنوان : ال USER INPUT و WHILE LOOPS
مقدمة عن حلقات while
حلقات for تأخذ مجموعة من العناصر وتنفذ كتلة من الشفرة مرة واحدة لكل عنصر في المجموعة. على النقيض، تعمل حلقات while طالما أن شرطًا معينًا صحيحًا.
حلقة while قيد التنفيذ
يمكنك استخدام حلقة while للعد حتى مجموعة من الأرقام. على سبيل المثال، الحلقة while التالية تعد من 1 إلى 5:
في السطر الأول، نبدأ العد من 1 بتعيين current_number القيمة 1. بعد ذلك، يتم تعيين حلقة while للعمل طالما كانت قيمة current_number أقل من أو تساوي 5. الكود داخل الحلقة يطبع قيمة current_number ثم يضيف 1 إلى تلك القيمة مع current_number += 1.
(المشغل += هو اختصار لـ
current_number = current_number + 1.)
يكرر Python الحلقة طالما كان الشرط current_number <= 5 صحيحًا. نظرًا لأن 1 أقل من 5، يطبع Python الرقم 1 ثم يضيف 1، مما يجعل الرقم الحالي 2. نظرًا لأن 2 أقل من 5، يطبع Python الرقم 2 ويضيف 1 مرة أخرى، مما يجعل الرقم الحالي 3، وهكذا. بمجرد أن تصبح قيمة current_number أكبر من 5، تتوقف الحلقة عن العمل وينتهي البرنامج:
البرامج التي تستخدمها كل يوم على الأرجح تحتوي على حلقات while. على سبيل المثال، تحتاج لعبة ما إلى حلقة while للحفاظ على التشغيل طالما أنك ترغب في الاستمرار في اللعب، ولتتمكن من التوقف عن التشغيل بمجرد أن تطلب منها التوقف. لن تكون البرامج ممتعة للاستخدام إذا توقفت عن التشغيل قبل أن نطلب منها ذلك أو استمرت في العمل حتى بعد أن نريد التوقف، لذلك تكون حلقات while مفيدة جدًا.
السماح للمستخدم بالاختيار متى يتوقف
يمكننا جعل برنامج parrot.py يعمل طالما أراد المستخدم عن طريق وضع معظم البرنامج داخل حلقة while. سنعرف قيمة الإنهاء ثم نواصل تشغيل البرنامج طالما لم يدخل المستخدم قيمة الإنهاء:
نحن نعرف أولاً مطالبة تخبر المستخدم بخياريه الاثنين: إدخال رسالة أو إدخال قيمة الإنهاء (في هذه الحالة، 'quit'). بعد ذلك نعد متغيرًا message لتتبع أي قيمة يدخلها المستخدم. نعرف message كـ string فارغ، ""، حتى يكون لدى Python شيء للمقارنة به في المرة الأولى التي يصل فيها إلى السطر while. في المرة الأولى التي يعمل فيها البرنامج ويصل Python إلى عبارة while، يحتاج إلى مقارنة قيمة message بـ 'quit'، لكن لم يتم إدخال أي مدخلات من المستخدم بعد. إذا لم يكن لدى Python أي شيء للمقارنة به، فلن يتمكن من مواصلة تشغيل البرنامج. لحل هذه المشكلة، نتأكد من إعطاء message قيمة ابتدائية. على الرغم من أنها مجرد سلسلة فارغة، فإنها ستجعل الأمر منطقيًا لـ Python وتسمح له بتنفيذ المقارنة التي تجعل حلقة while تعمل. هذه الحلقة while تعمل طالما أن قيمة message ليست 'quit'.
في المرة الأولى من خلال الحلقة، تكون message مجرد سلسلة فارغة، لذا يدخل Python إلى الحلقة. عند message = input(prompt)، يعرض Python النص المطلوب وينتظر من المستخدم إدخال نصه. يتم تعيين أي شيء يدخلونه إلى message ويطبع؛ ثم يعيد Python تقييم الشرط في عبارة while. طالما لم يدخل المستخدم الكلمة 'quit'، يعرض النص المطلوب مرة أخرى وينتظر المزيد من المدخلات. عندما يدخل المستخدم أخيرًا 'quit'، يتوقف Python عن تنفيذ حلقة while وينتهي البرنامج:
هذا البرنامج يعمل جيدًا، إلا أنه يطبع كلمة 'quit' كما لو كانت رسالة فعلية. اختبار if بسيط يصلح هذا:
الآن يقوم البرنامج بإجراء تحقق سريع قبل عرض الرسالة ويطبع الرسالة فقط إذا لم تتطابق مع قيمة الإنهاء:
استخدام (Flag)
في المثال السابق، جعلنا البرنامج ينفذ مهام معينة بينما كانت حالة معينة صحيحة. ولكن ماذا عن البرامج الأكثر تعقيدًا التي يمكن أن تسبب فيها أحداث عديدة توقف البرنامج عن التشغيل؟ على سبيل المثال، في لعبة، يمكن أن تنتهي اللعبة بسبب عدة أحداث مختلفة. عندما ينفذ اللاعب السفن، أو ينتهي وقته، أو يتم تدمير المدن التي كان من المفترض أن يحميها، يجب أن تنتهي اللعبة. يجب أن تنتهي إذا حدث أي من هذه الأحداث. إذا كان هناك العديد من الأحداث المحتملة التي قد تحدث لتوقف البرنامج، فإن محاولة اختبار كل هذه الشروط في جملة while واحدة تصبح معقدة وصعبة.
بالنسبة للبرنامج الذي يجب أن يعمل فقط طالما كانت العديد من الشروط صحيحة، يمكنك تعريف متغير واحد يحدد ما إذا كان البرنامج بأكمله نشطًا أم لا. هذا المتغير، الذي يسمى علامة (flag)، يعمل كإشارة للبرنامج. يمكننا كتابة برامجنا بحيث تعمل طالما كانت ال flag مضبوطة على True وتتوقف عن العمل عندما يجعل أي من الأحداث العديدة قيمة ال flag تكون False. نتيجة لذلك، يحتاج بيان while الخاص بنا إلى التحقق من حالة واحدة فقط: ما إذا كانت ال flag حاليًا True. بعد ذلك، يمكن تنظيم جميع الاختبارات الأخرى (لمعرفة ما إذا كان قد حدث حدث يجب أن يجعل العلامة False) بشكل منظم في باقي البرنامج.
لنقم بإضافة flag إلى parrot.py من القسم السابق. هذه العلامة، التي سنسميها active (على الرغم من أنه يمكنك تسميتها أي شيء)، ستراقب ما إذا كان البرنامج يجب أن يستمر في التشغيل أم لا:ِ
لقد ضبطنا المتغير active على True لكي يبدأ البرنامج في حالة نشطة. القيام بذلك يجعل جملة while أكثر بساطة لأنه لا يتم إجراء مقارنة في جملة while نفسها؛ يتم التعامل مع المنطق في أجزاء أخرى من البرنامج. طالما أن المتغير active يظل True، ستستمر الحلقة في التشغيل.
في جملة if داخل حلقة while، نتحقق من قيمة message بمجرد أن يدخل المستخدم مدخلاته. إذا أدخل المستخدم 'quit'، نضبط active على False، وتتوقف حلقة while. إذا أدخل المستخدم أي شيء آخر غير 'quit'، نقوم بطباعة إدخالهم كرسالة.
هذا البرنامج له نفس المخرجات مثل المثال السابق حيث وضعنا الاختبار الشرطي مباشرة في جملة while. ولكن الآن بعد أن لدينا علامة تشير إلى ما إذا كان البرنامج بأكمله في حالة نشطة، سيكون من السهل إضافة اختبارات أخرى (مثل جمل elif) للأحداث التي يجب أن تجعل active تصبح False. هذا مفيد في البرامج المعقدة مثل الألعاب، حيث قد تكون هناك العديد من الأحداث التي يجب أن تجعل البرنامج يتوقف عن التشغيل. عندما يتسبب أي من هذه الأحداث في أن تصبح العلامة active False، ستخرج الحلقة الرئيسية للعبة، يمكن عرض رسالة Game Over، ويمكن إعطاء اللاعب خيار اللعب مرة أخرى.
استخدام break للخروج من الحلقة
للخروج من حلقة while فورًا دون تشغيل أي كود متبقٍ في الحلقة، بغض النظر عن نتائج أي اختبار شرطي، استخدم جملة break. جملة break توجه تدفق برنامجك؛ يمكنك استخدامها للتحكم في الأسطر التي يتم تنفيذها والتي لا يتم تنفيذها، بحيث ينفذ البرنامج الكود الذي تريده فقط، في الوقت الذي تريده.
على سبيل المثال، اعتبر برنامجًا يسأل المستخدم عن الأماكن التي زارها. يمكننا إيقاف حلقة while في هذا البرنامج باستخدام break بمجرد أن يدخل المستخدم القيمة 'quit':
حلقة تبدأ بجملة while True ستستمر في التشغيل إلى الأبد ما لم تصل إلى جملة break. الحلقة في هذا البرنامج تستمر في سؤال المستخدم عن أسماء المدن التي زارها حتى يدخل 'quit'. عندما يدخلون 'quit'، يتم تشغيل جملة break، مما يجعل Python يخرج من الحلقة:
ملاحظة:
يمكنك استخدام جملة break في أي من حلقات Python. على سبيل المثال، يمكنك استخدام break للخروج من حلقة for التي تعمل عبر قائمة أو قاموس.
استخدام continue في حلقة
بدلاً من الخروج من الحلقة تمامًا دون تنفيذ بقية الكود فيها، يمكنك استخدام جملة continue للعودة إلى بداية الحلقة، بناءً على نتيجة اختبار شرطي. على سبيل المثال، اعتبر حلقة تعد من 1 إلى 10 لكنها تطبع فقط الأرقام الفردية في هذا النطاق:
أولاً، نضبط current_number على 0. لأن قيمته أقل من 10، يدخل Python حلقة while. بمجرد داخل الحلقة، نزيد العداد بمقدار 1، لذا current_number يصبح 1. ثم تتحقق جملة if من باقي قسمة current_number على 2. إذا كان باقي القسمة 0 (مما يعني أن current_number قابل للقسمة على 2)، تخبر جملة continue Python بتجاهل بقية الحلقة والعودة إلى البداية. إذا لم يكن الرقم الحالي قابلاً للقسمة على 2، يتم تنفيذ بقية الحلقة ويطبع Python الرقم الحالي:
تجنب الحلقات اللانهائية
كل حلقة while تحتاج إلى طريقة للتوقف عن التشغيل حتى لا تستمر في التشغيل إلى الأبد. على سبيل المثال، يجب أن تعد هذه الحلقة من 1 إلى 5:
ومع ذلك، إذا قمت بطريق الخطأ بإغفال السطر x += 1، ستستمر الحلقة في التشغيل إلى الأبد:
الآن ستبدأ قيمة x عند 1 ولكنها لن تتغير أبدًا. نتيجة لذلك، سيظل الاختبار الشرطي x <= 5 صحيحًا دائمًا وستستمر حلقة while في التشغيل إلى الأبد، وتطبع سلسلة من 1، مثل هذا:
كل مبرمج يكتب عن طريق الخطأ حلقة while لا نهائية من وقت لآخر، خاصة عندما تحتوي حلقات البرنامج على شروط خروج خفية. إذا علقت برنامجك في حلقة لا نهائية، اضغط على CTRL-C أو اغلق ببساطة نافذة الطرفية التي تعرض مخرجات البرنامج.
لتجنب كتابة الحلقات اللانهائية، اختبر كل حلقة while وتأكد من توقف الحلقة عندما تتوقعها. إذا كنت تريد أن ينتهي برنامجك عندما يدخل المستخدم قيمة إدخال معينة، قم بتشغيل البرنامج وادخل تلك القيمة. إذا لم ينته البرنامج، دقق في الطريقة التي يتعامل بها برنامجك مع القيمة التي يجب أن تسبب خروج الحلقة. تأكد من أن جزءًا واحدًا على الأقل من البرنامج يمكن أن يجعل شرط الحلقة False أو يتسبب في الوصول إلى جملة break.
ملاحظة: VS Code، مثل العديد من المحررين، يعرض المخرجات في نافذة طرفية مدمجة. لإلغاء حلقة لا نهائية، تأكد من النقر في منطقة المخرجات للمحرر قبل الضغط على CTRL-C.
جرب بنفسك
تمرين 7-4. إضافات البيتزا: اكتب حلقة تطالب المستخدم بإدخال سلسلة من إضافات البيتزا حتى يدخلوا قيمة 'quit'. بينما يدخلون كل إضافة، اطبع رسالة تقول أنك ستضيف تلك الإضافة إلى البيتزا الخاصة بهم.
تمرين تذاكر السينما: تفرض دار السينما أسعار تذاكر مختلفة بناءً على عمر الشخص. إذا كان عمر الشخص أقل من 3 سنوات، فإن التذكرة مجانية؛ إذا كان عمرهم بين 3 و 12 عامًا، فإن التذكرة تكلف 10 دولارات؛ وإذا كانوا فوق 12 عامًا، فإن التذكرة تكلف 15 دولارًا. اكتب حلقة تسأل المستخدمين عن أعمارهم، ثم أخبرهم بتكلفة تذكرتهم السينمائية.
تمرين ثلاثة مخارج: اكتب نسخًا مختلفة من تمرين 7-4 أو 7-5 التي تقوم بكل مما يلي على الأقل مرة واحدة:
استخدم اختبارًا شرطيًا في جملة while لإيقاف الحلقة.
استخدم متغيرًا نشطًا للتحكم في مدة تشغيل الحلقة.
استخدم جملة break للخروج من الحلقة عندما يدخل المستخدم قيمة 'quit'.
تمرين اللانهائية: اكتب حلقة لا تنتهي أبدًا، وقم بتشغيلها.
(لإنهاء الحلقة، اضغط على CTRL-C أو أغلق نافذة الطرفية التي تعمل بها.)
النهاية
نكون هنا انتهينا من الجزء 2 من الفصل 7 من منهج تعلم Python من كتاب python crash course بالعربية
واذا واجهتك اي مشكلة في الفهم او ما شابه , يمكنك على الفور الذهاب الى المجتمع الخاص بنا في Telegram للمناقشة والتواصل معنا من هنا
او اذا واجهتك مشكلة في الموقع او تريد اجابة سريعة يمكنك الذهاب الى اخر صفحة في الموقع ستجد صفحة اتصل بنا موجودة يمكنك ارسالة لنا مشكلتك , وسيتم الرد عليها بسرعة جدا ان شاء الله
ويمكنك الأنضمام الى المجتمع Hidden Lock بالكامل مع جميع قنواته للأستفادة في اخر الأخبار في عالم التقنية وايضا الكتب بالمجان والكورسات والمقالات من خلال الرابط التالي لمجموعة القنوات من هنا
يمكنك ايضا متابعتنا في منصات X او Twitter سابقا , لمشاهدة الاخبار والمقالات السريعة والمهمة من
وفقط كان معكم sparrow مقدم هذه الشهادة من فريق Hidden Lock