دليل شامل لحلقات While في بايثون: من الأساسيات إلى التحكم المتقدم

دقائق القراءة: 1

تُعد حلقات التكرار (Loops) من اللبنات الأساسية في أي لغة برمجة، وهي تسمح للمطورين بتنفيذ مجموعة من التعليمات بشكل متكرر حتى يتم استيفاء شرط معين. في بايثون، هناك نوعان رئيسيان من الحلقات: حلقات for وحلقات while. بينما تُستخدم حلقات for عادةً للتكرار على تسلسلات معروفة (مثل القوائم والسلاسل)، فإن حلقات while تُفضل عندما يكون عدد التكرارات غير معروف مسبقًا ويعتمد على شرط معين. في هذا الدليل الشامل، سنتعمق في فهم حلقات while في بايثون، بدءًا من مفاهيمها الأساسية وصولًا إلى تقنيات التحكم المتقدمة فيها.

فهم حلقات While في بايثون

المبدأ الكامن وراء حلقة while بسيط للغاية: “طالما أن الشرط صحيح، قم بتنفيذ الأوامر.”

تقوم حلقة while بالتحقق من الشرط في كل مرة، وإذا كان الشرط يعيد قيمة True، فإنها تنفذ التعليمات الموجودة داخل جسم الحلقة. يستمر هذا التكرار حتى يصبح الشرط False.

قبل أن نبدأ بكتابة الأكواد، دعونا نلقي نظرة على المخطط الانسيابي التالي الذي يوضح آلية عمل حلقة while:

مخطط انسيابي يوضح آلية عمل حلقة While في بايثون

الآن، لنكتب بعض الأكواد. إليك كيفية كتابة حلقة while بسيطة لطباعة الأرقام من 1 إلى 10:

#!/usr/bin/python
x = 1
while (x <= 10):
    print(x)
    x = x + 1

في الكود أعلاه، ستعمل الحلقة فقط إذا كانت قيمة المتغير x أقل من أو تساوي 10. إذا قمت بتهيئة x بقيمة 20، فلن يتم تنفيذ الحلقة إطلاقًا.

إليك مخرجات تنفيذ حلقة while هذه:

> python script.py
1
2
3
4
5
6
7
8
9
10

محاكاة حلقة Do-While في بايثون

توجد عادةً نسختان من حلقات التكرار الشرطية في العديد من لغات البرمجة: while و do-while. يكمن الاختلاف الجوهري بينهما في أن حلقة do-while تضمن تنفيذ التعليمات مرة واحدة على الأقل، بغض النظر عن الشرط. بينما قد لا تُنفذ حلقة while التقليدية ولا مرة واحدة إذا لم يتم استيفاء الشرط من البداية. حلقة do-while تنفذ التعليمات أولاً، ثم تتحقق من الشرط للتكرارات اللاحقة.

مخطط انسيابي يوضح آلية عمل حلقة Do-While

على الرغم من وجودها في معظم لغات البرمجة الشائعة، إلا أن بايثون لا تحتوي على بنية do-while مدمجة. ومع ذلك، يمكنك بسهولة محاكاة سلوك حلقة do-while باستخدام أساليب أخرى، مثل الدوال (Functions).

دعنا نجرب نهج محاكاة do-while عن طريق تغليف الأوامر داخل دالة:

#!/usr/bin/python
x = 20

def run_commands():
    global x # يجب استخدام global لتعديل x خارج نطاق الدالة
    x = x + 1
    print(x)

run_commands() # تنفيذ الدالة مرة واحدة على الأقل
while (x <= 10):
    run_commands()

الكود أعلاه يقوم بتشغيل الدالة run_commands() مرة واحدة قبل استدعاء حلقة while. بمجرد بدء حلقة while، لن يتم تنفيذ الدالة run_commands() مرة أخرى في هذا المثال، لأن قيمة x تساوي 20 (مما يجعل الشرط x <= 10 خاطئًا).

استخدام Else مع حلقات While

يمكنك إضافة عبارة else لتُنفذ عندما يفشل شرط الحلقة (أي عندما يصبح False). دعنا نضف شرط else إلى كودنا لطباعة "Done" بمجرد الانتهاء من طباعة الأرقام من 1 إلى 10:

#!/usr/bin/python
x = 1
while (x <= 10):
    print(x)
    x = x + 1
else:
    print("Done")

سيقوم الكود أعلاه أولاً بطباعة الأرقام من 1 إلى 10. عندما تصبح قيمة x هي 11، سيفشل شرط while (x <= 10)، مما يؤدي إلى تشغيل عبارة else وطباعة "Done".

حلقة While في سطر واحد

إذا كان لديك سطر واحد فقط من الكود داخل حلقة while، يمكنك استخدام الصيغة المختصرة ذات السطر الواحد. ومع ذلك، يُنصح عادةً باستخدام الكتل البرمجية الواضحة لزيادة قابلية قراءة الكود، خاصة في المشاريع الكبيرة.

#!/usr/bin/python
x = 3
while x > 0: print(x); x -= 1 # مثال يطبع 3، 2، 1 ثم يتوقف
print("انتهى")

الحلقات اللانهائية (Infinite Loops)

إذا لم تكن حذرًا أثناء كتابة الحلقات، فقد تُنشئ حلقات لا نهائية. الحلقات اللانهائية هي تلك التي يكون فيها الشرط صحيحًا دائمًا، وبالتالي تستمر في التنفيذ إلى الأبد، مما قد يؤدي إلى استهلاك موارد النظام أو تعليق التطبيق.

إليك مثال على حلقة لا نهائية:

#!/usr/bin/python
x = 1
while (x >= 1):
    print(x)

الكود أعلاه هو مثال على حلقة لا نهائية. لا يوجد أمر لتغيير قيمة المتغير x، لذا فإن الشرط "x أكبر من أو يساوي 1" سيكون صحيحًا دائمًا. هذا سيجعل الحلقة تعمل إلى الأبد.

كن دائمًا حذرًا عند كتابة الحلقات. فخطأ صغير يمكن أن يؤدي إلى حلقة لا نهائية وتعطيل تطبيقك.

التحكم في تدفق الحلقات

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

Break: إنهاء الحلقة

تُستخدم عبارة break للخروج من الحلقة فورًا، حتى لو كان شرط الحلقة الرئيسي لا يزال صحيحًا.

دعنا نرى كيف يمكننا الخروج من الحلقة عندما تكون قيمة x تساوي 5:

#!/usr/bin/python
x = 1
while (x <= 10):
    if (x == 5):
        break
    print(x)
    x += 1

في الكود أعلاه، ستتوقف الحلقة عن التنفيذ عندما تصبح قيمة x هي 5، على الرغم من أن الشرط x <= 10 لا يزال صحيحًا في تلك النقطة. ستكون المخرجات: 1، 2، 3، 4.

Continue: تخطي التكرار الحالي

إليك سيناريو آخر: لنفترض أنك تريد تخطي التكرار الحالي للحلقة إذا تم استيفاء شرط معين، ولكنك تريد متابعة التكرارات اللاحقة حتى يصبح شرط while الرئيسي خاطئًا. يمكنك استخدام الكلمة المفتاحية continue لذلك، كما يلي:

#!/usr/bin/python
x = 1
while (x <= 10):
    if (x == 5):
        x += 1 # زيادة x قبل التخطي لتجنب حلقة لا نهائية إذا لم يتغير x
        continue
    print(x)
    x += 1

في المثال أعلاه، ستطبع الحلقة الأرقام من 1 إلى 10، باستثناء الرقم 5. عندما تصبح قيمة x هي 5، يتم تخطي باقي الأوامر في التكرار الحالي (وهو print(x))، ويعود تدفق التحكم إلى بداية حلقة while، بعد زيادة x إلى 6. هذا يضمن أن الرقم 5 لا يُطبع، وأن الحلقة تستمر بشكل طبيعي.

ملخص حلقات While في بايثون

تُعد حلقات التكرار من المكونات الأكثر فائدة في البرمجة والتي ستستخدمها بشكل يومي. في بايثون، تُعد حلقات for و while هما النوعين الرئيسيين. بينما لا تدعم بايثون بنية do-while بشكل مباشر، يمكن محاكاتها بسهولة. يمكنك التحكم في تدفق البرنامج داخل الحلقات باستخدام الأوامر break للخروج من الحلقة و continue لتخطي التكرار الحالي. تذكر دائمًا أن تكون حذرًا لتجنب إنشاء حلقات لا نهائية عن طريق الخطأ.

الخلاصة التقنية

تُظهر حلقات while في بايثون مرونة وقوة كبيرة في التعامل مع السيناريوهات التي تتطلب تكرارًا مشروطًا. على الرغم من بساطة مفهومها، فإن إتقان استخدامها يتطلب فهمًا دقيقًا لكيفية تعديل شرط الحلقة لتجنب الحلقات اللانهائية، وكيفية الاستفادة من عبارات التحكم مثل break و continue لتحسين كفاءة الكود ومنطقه. كما أن القدرة على محاكاة سلوك do-while باستخدام الدوال أو تراكيب أخرى تُبرز مرونة بايثون في التكيف مع أنماط البرمجة المختلفة. إن فهم هذه الجوانب يُمكّن المطورين من كتابة برامج أكثر قوة وفعالية، قادرة على التعامل مع تحديات برمجية متنوعة.

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *