حلقات التكرار While في بايثون: دليل شامل للأمثلة والحلقات اللانهائية

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

في هذا المقال، ستتعلم:

  • ما هي حلقات التكرار while.
  • ما هي استخداماتها الشائعة.
  • متى يجب استخدامها.
  • كيف تعمل هذه الحلقات على المستوى الداخلي.
  • كيفية كتابة حلقة while في بايثون.
  • ما هي الحلقات اللانهائية وكيفية إيقافها.
  • فهم استخدام while True وبنيتها العامة.
  • كيفية استخدام جملة break لإيقاف حلقة while.

سوف نتعمق في كيفية عمل حلقات while من خلال أمثلة عملية ورسوم بيانية توضيحية. هل أنت مستعد؟ لنبدأ!

الغرض من حلقات التكرار While وحالات استخدامها

لنبدأ بفهم الغرض الأساسي من حلقات التكرار while. ما هي استخداماتها؟ تُستخدم هذه الحلقات لتكرار تسلسل من الأوامر لعدد غير معروف مسبقاً من المرات. تستمر حلقة التكرار هذه في العمل طالما أن الشرط المحدد لها يُقيّم إلى القيمة True، وتتوقف فقط عندما يصبح الشرط False.

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

💡 نصيحة: إذا لم يُقيّم شرط حلقة while إلى False أبداً، فسنواجه حلقة لانهائية، وهي حلقة لا تتوقف (نظرياً) بدون تدخل خارجي.

فيما يلي بعض الأمثلة لحالات الاستخدام الواقعية لحلقات while:

  • إدخال المستخدم (User Input): عند طلب إدخال من المستخدم، نحتاج إلى التحقق مما إذا كانت القيمة المدخلة صالحة. لا يمكننا معرفة مسبقاً كم مرة سيدخل المستخدم قيمة غير صالحة قبل أن يتمكن البرنامج من المتابعة. لذلك، ستكون حلقة while مثالية لهذا السيناريو.

  • البحث (Search): يعد البحث عن عنصر في بنية بيانات حالة استخدام مثالية أخرى لحلقة while، لأنه لا يمكننا معرفة مسبقاً عدد التكرارات اللازمة للعثور على القيمة المستهدفة. على سبيل المثال، يمكن تنفيذ خوارزمية البحث الثنائي (Binary Search) باستخدام حلقة while.

  • الألعاب (Games): في لعبة، يمكن استخدام حلقة while للحفاظ على منطق اللعبة الرئيسي قيد التشغيل حتى يخسر اللاعب أو تنتهي اللعبة. لا يمكننا معرفة مسبقاً متى سيحدث هذا، لذا فهذا سيناريو مثالي آخر لحلقة while.

كيف تعمل حلقات التكرار While

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

مخطط تدفق يوضح كيفية عمل حلقة التكرار While في بايثون

دعنا نفصل هذا المخطط بمزيد من التفصيل:

  1. تبدأ العملية عندما يتم العثور على حلقة while أثناء تنفيذ البرنامج.
  2. يتم تقييم الشرط للتحقق مما إذا كان True أو False.
  3. إذا كان الشرط True، يتم تنفيذ الأوامر التي تنتمي إلى الحلقة (جسم الحلقة).
  4. يتم التحقق من شرط حلقة while مرة أخرى.
  5. إذا تم تقييم الشرط إلى True مرة أخرى، يتم تشغيل تسلسل الأوامر مرة أخرى وتتكرر العملية.
  6. عندما يتم تقييم الشرط إلى False، تتوقف الحلقة ويستمر البرنامج في التنفيذ بعد الحلقة.

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

البنية العامة لحلقات التكرار While

رائع! الآن أنت تعرف كيف تعمل حلقات while، لذا دعنا نتعمق في الكود ونرى كيف يمكنك كتابة حلقة while في بايثون. هذه هي البنية الأساسية:

مخطط يوضح البنية الأساسية لحلقة التكرار While في بايثون

هذه هي العناصر الرئيسية (بالترتيب):

  • الكلمة المفتاحية while (متبوعة بمسافة).
  • شرط لتحديد ما إذا كانت الحلقة ستستمر في العمل أم لا بناءً على قيمته المنطقية (True أو False).
  • نقطتان رأسيتان (:) في نهاية السطر الأول.
  • تسلسل الأوامر التي سيتم تكرارها. تُسمى هذه الكتلة من الكود “جسم الحلقة” ويجب أن تكون مُزاحة للداخل (indented). إذا لم يكن الأمر مُزاحاً، فلن يُعتبر جزءاً من الحلقة (يرجى مراجعة الرسم التوضيحي أدناه).

رسم توضيحي يوضح أهمية الإزاحة في تحديد جسم حلقة While في بايثون

💡 نصيحة: يوصي دليل أسلوب بايثون (PEP 8) باستخدام 4 مسافات لكل مستوى إزاحة. يجب استخدام علامات التبويب (Tabs) فقط للحفاظ على الاتساق مع الكود الذي تمت إزاحته بالفعل باستخدام علامات التبويب.

أمثلة عملية لحلقات التكرار While

الآن بعد أن عرفت كيف تعمل حلقات while وكيفية كتابتها في بايثون، دعنا نرى كيف تعمل على المستوى الداخلي مع بعض الأمثلة.

كيف تعمل حلقة While أساسية

إليك حلقة while أساسية تقوم بطباعة قيمة المتغير i طالما أن i أقل من 8 (i < 8):

i = 4
while i < 8:
    print(i)
    i += 1

إذا قمنا بتشغيل الكود، فسنرى هذا الإخراج:

4
5
6
7

دعنا نرى ما يحدث على المستوى الداخلي عندما يتم تشغيل الكود:

مخطط يوضح تتبع تنفيذ حلقة While الأساسية خطوة بخطوة

  • التكرار الأول: في البداية، قيمة i هي 4، لذا يتم تقييم الشرط i < 8 إلى True وتبدأ الحلقة في العمل. تُطبع قيمة i (4) ثم تُزاد هذه القيمة بمقدار 1. تبدأ الحلقة مرة أخرى.
  • التكرار الثاني: الآن قيمة i هي 5، لذا يتم تقييم الشرط i < 8 إلى True. يتم تشغيل جسم الحلقة، وتُطبع قيمة i (5) ثم تُزاد هذه القيمة i بمقدار 1. تبدأ الحلقة مرة أخرى.
  • التكراران الثالث والرابع: تتكرر نفس العملية للتكرارين الثالث والرابع، لذا تُطبع الأعداد الصحيحة 6 و 7.
  • قبل بدء التكرار الخامس، تكون قيمة i هي 8. الآن يتم تقييم شرط حلقة while وهو i < 8 إلى False وتتوقف الحلقة فوراً.

💡 نصيحة: إذا كان شرط حلقة while هو False قبل بدء التكرار الأول، فلن تبدأ حلقة while في العمل على الإطلاق.

إدخال المستخدم باستخدام حلقة While

الآن دعنا نرى مثالاً على حلقة while في برنامج يأخذ إدخال المستخدم. سنستخدم الدالة input() لطلب من المستخدم إدخال عدد صحيح، وسيتم إلحاق هذا العدد الصحيح بقائمة فقط إذا كان زوجياً. هذا هو الكود:

# Define the list
nums = []

# The loop will run while the length of the
# list nums is less than 4
while len(nums) < 4:
    # Ask for user input and store it in a variable as an integer.
    user_input = int(input("Enter an integer: "))

    # If the input is an even number, add it to the list
    if user_input % 2 == 0:
        nums.append(user_input)

شرط الحلقة هو len(nums) < 4، لذا ستعمل الحلقة طالما أن طول القائمة nums أقل تماماً من 4. دعنا نحلل هذا البرنامج سطراً بسطر:

  1. نبدأ بتعريف قائمة فارغة وتعيينها لمتغير يسمى nums.
  2. nums = []
  3. ثم، نحدد حلقة while التي ستعمل طالما أن len(nums) < 4.
  4. while len(nums) < 4:
  5. نطلب إدخال المستخدم باستخدام الدالة input() ونخزنه في المتغير user_input.
  6. user_input = int(input("Enter an integer: "))

    💡 نصيحة: نحتاج إلى تحويل (casting) القيمة التي أدخلها المستخدم إلى عدد صحيح باستخدام الدالة int() قبل تعيينها للمتغير، لأن الدالة input() تُرجع سلسلة نصية (string).

  7. نتحقق مما إذا كانت هذه القيمة زوجية أم فردية.
  8. if user_input % 2 == 0:
  9. إذا كانت زوجية، نلحقها بقائمة nums.
  10. nums.append(user_input)
  11. وإلا، إذا كانت فردية، تبدأ الحلقة مرة أخرى ويتم التحقق من الشرط لتحديد ما إذا كان يجب أن تستمر الحلقة أم لا.

إذا قمنا بتشغيل هذا الكود مع إدخال مستخدم مخصص، فسنحصل على الإخراج التالي:

Enter an integer: 3
Enter an integer: 4
Enter an integer: 2
Enter an integer: 1
Enter an integer: 7
Enter an integer: 6
Enter an integer: 3
Enter an integer: 4

يلخص هذا الجدول ما يحدث على المستوى الداخلي عندما يتم تشغيل الكود:

جدول يوضح تتبع إدخال المستخدم وحالة قائمة الأرقام في حلقة While

💡 نصيحة: القيمة الأولية لـ len(nums) هي 0 لأن القائمة فارغة في البداية. يوضح العمود الأخير من الجدول طول القائمة في نهاية التكرار الحالي. تُستخدم هذه القيمة للتحقق من الشرط قبل بدء التكرار التالي.

كما ترى في الجدول، يدخل المستخدم أعداداً صحيحة زوجية في التكرارات الثانية والثالثة والسادسة والثامنة، ويتم إلحاق هذه القيم بقائمة nums. قبل بدء التكرار "التاسع"، يتم التحقق من الشرط مرة أخرى، لكنه الآن يُقيّم إلى False لأن قائمة nums تحتوي على أربعة عناصر (طولها 4)، لذا تتوقف الحلقة.

إذا تحققنا من قيمة قائمة nums عند اكتمال العملية، فسنرى هذا:

>>> nums
[4, 2, 6, 4]

بالضبط ما توقعناه، توقفت حلقة while عندما تم تقييم الشرط len(nums) < 4 إلى False.

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

نصائح حول الشرط في حلقات التكرار While

قبل أن تبدأ العمل مع حلقات while، يجب أن تعلم أن شرط الحلقة يلعب دوراً مركزياً في وظائف وإخراج حلقة while.

رسم توضيحي يبرز أهمية الشرط في التحكم بحلقة While

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

  • استخدام < (أقل من) بدلاً من <= (أقل من أو يساوي) (أو العكس).
  • استخدام > (أكبر من) بدلاً من >= (أكبر من أو يساوي) (أو العكس).

يمكن أن يؤثر هذا على عدد تكرارات الحلقة وحتى على إخراجها. دعنا نرى مثالاً:

إذا كتبنا حلقة while هذه بالشرط i < 9:

i = 6
while i < 9:
    print(i)
    i += 1

نرى هذا الإخراج عندما يتم تشغيل الكود:

6
7
8

تكمل الحلقة ثلاثة تكرارات وتتوقف عندما تكون قيمة i مساوية لـ 9. يوضح هذا الجدول ما يحدث على المستوى الداخلي عندما يتم تشغيل الكود:

جدول يوضح تتبع تنفيذ حلقة While مع شرط i أقل من 9

  • قبل التكرار الأول للحلقة، تكون قيمة i هي 6، لذا يكون الشرط i < 9 هو True وتبدأ الحلقة في العمل. تُطبع قيمة i ثم تُزاد بمقدار 1.
  • في التكرار الثاني للحلقة، تكون قيمة i هي 7، لذا يكون الشرط i < 9 هو True. يتم تشغيل جسم الحلقة، وتُطبع قيمة i، ثم تُزاد بمقدار 1.
  • في التكرار الثالث للحلقة، تكون قيمة i هي 8، لذا يكون الشرط i < 9 هو True. يتم تشغيل جسم الحلقة، وتُطبع قيمة i، ثم تُزاد بمقدار 1.
  • يتم التحقق من الشرط مرة أخرى قبل بدء التكرار الرابع، لكن الآن قيمة i هي 9، لذا يكون الشرط i < 9 هو False وتتوقف الحلقة.

في هذه الحالة، استخدمنا < كعامل مقارنة في الشرط، ولكن ما الذي تعتقد أنه سيحدث إذا استخدمنا <= بدلاً من ذلك؟

i = 6
while i <= 9:
    print(i)
    i += 1

نرى هذا الإخراج:

6
7
8
9

تكمل الحلقة تكراراً واحداً إضافياً لأننا الآن نستخدم عامل "أقل من أو يساوي" <=، لذا يظل الشرط True عندما تكون قيمة i مساوية لـ 9. يوضح هذا الجدول ما يحدث على المستوى الداخلي:

جدول يوضح تتبع تنفيذ حلقة While مع شرط i أقل من أو يساوي 9

تكتمل أربعة تكرارات. يتم التحقق من الشرط مرة أخرى قبل بدء التكرار "الخامس". في هذه المرحلة، تكون قيمة i هي 10، لذا يكون الشرط i <= 9 هو False وتتوقف الحلقة.

الحلقات اللانهائية While

الآن أنت تعرف كيف تعمل حلقات while، ولكن ما الذي تعتقد أنه سيحدث إذا لم يُقيّم شرط حلقة while إلى False أبداً؟

صورة توضيحية لسؤال: ماذا يحدث إذا لم يتوقف شرط حلقة While؟

ما هي الحلقات اللانهائية While؟

تذكر أن حلقات while لا تُحدّث المتغيرات تلقائياً (نحن المسؤولون عن القيام بذلك صراحةً في الكود الخاص بنا). لذلك لا يوجد ضمان بأن الحلقة ستتوقف ما لم نكتب الكود اللازم لجعل الشرط False في مرحلة ما أثناء تنفيذ الحلقة.

إذا لم نفعل ذلك وظل الشرط يُقيّم دائماً إلى True، فسنواجه حلقة لانهائية (infinite loop)، وهي حلقة while تعمل إلى أجل غير مسمى (نظرياً). عادةً ما تكون الحلقات اللانهائية ناتجة عن خطأ برمجي (bug)، ولكن يمكن أيضاً أن تُسبب عمداً عندما نريد تكرار تسلسل من الأوامر إلى أجل غير مسمى حتى يتم العثور على جملة break.

دعنا نرى هذين النوعين من الحلقات اللانهائية في الأمثلة أدناه.

💡 نصيحة: الخطأ البرمجي (bug) هو عيب في البرنامج يتسبب في نتائج غير صحيحة أو غير متوقعة.

مثال على حلقة لانهائية غير مقصودة

هذا مثال على حلقة لانهائية غير مقصودة ناتجة عن خطأ في البرنامج:

# Define a variable
i = 5

# Run this loop while i is less than 15
while i < 15:
    # Print a message
    print("Hello, World!")

حلل هذا الكود للحظة. ألا تلاحظ شيئاً مفقوداً في جسم الحلقة؟ هذا صحيح! قيمة المتغير i لا يتم تحديثها أبداً (تظل دائماً 5). لذلك، يكون الشرط i < 15 دائماً True ولا تتوقف الحلقة أبداً.

إذا قمنا بتشغيل هذا الكود، فسيكون الإخراج تسلسلاً "لانهائياً" من رسائل Hello, World! لأن جسم الحلقة print("Hello, World!") سيعمل إلى أجل غير مسمى.

Hello, World!
Hello, World!
Hello, World!
Hello, World!
Hello, World!
Hello, World!
Hello, World!
Hello, World!
Hello, World!
Hello, World!
Hello, World!
Hello, World!
Hello, World!
Hello, World!
Hello, World!
Hello, World!
Hello, World!
Hello, World!
. . .
# Continues indefinitely

لإيقاف البرنامج، سنحتاج إلى مقاطعة الحلقة يدوياً بالضغط على CTRL + C. عندما نفعل ذلك، سنرى خطأ KeyboardInterrupt مشابهاً لهذا:

لقطة شاشة لخطأ KeyboardInterrupt عند إيقاف حلقة لانهائية

لإصلاح هذه الحلقة، سنحتاج إلى تحديث قيمة i في جسم الحلقة للتأكد من أن الشرط i < 15 سيُقيّم في النهاية إلى False. هذا أحد الحلول الممكنة، زيادة قيمة i بمقدار 2 في كل تكرار:

i = 5
while i < 15:
    print("Hello, World!")
    # Update the value of i
    i += 2

رائع! الآن أنت تعرف كيفية إصلاح الحلقات اللانهائية الناتجة عن خطأ برمجي. ما عليك سوى كتابة كود يضمن أن الشرط سيُقيّم في النهاية إلى False. دعنا نبدأ في التعمق في الحلقات اللانهائية المقصودة وكيف تعمل.

كيفية إنشاء حلقة لانهائية باستخدام While True

يمكننا إنشاء حلقة لانهائية عمداً باستخدام while True. في هذه الحالة، ستعمل الحلقة إلى أجل غير مسمى حتى يتم إيقاف العملية بتدخل خارجي (CTRL + C) أو عندما يتم العثور على جملة break (ستتعلم المزيد عن break بعد قليل).

هذه هي البنية الأساسية:

مخطط يوضح بنية حلقة While True اللانهائية

بدلاً من كتابة شرط بعد الكلمة المفتاحية while، نكتب القيمة المنطقية مباشرةً للإشارة إلى أن الشرط سيكون دائماً True. إليك مثال:

>>> while True:
...     print(0)
...
0
0
0
0
0
0
0
0
0
0
0
0
0
Traceback (most recent call last):
  File "<pyshell#2>", line 2, in <module>
    print(0)
KeyboardInterrupt

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

جملة Break

تُستخدم هذه الجملة لإيقاف حلقة تكرار فوراً. يجب أن تفكر فيها كـ "إشارة توقف" حمراء يمكنك استخدامها في الكود الخاص بك للتحكم بشكل أكبر في سلوك الحلقة.

رسم توضيحي لجملة Break كإشارة توقف

وفقاً لوثائق بايثون:

جملة break، كما هو الحال في لغة C، تخرج من أقرب حلقة for أو while محيطة.

يوضح هذا الرسم التوضيحي المنطق الأساسي لجملة break:

مخطط تدفق يوضح كيفية عمل جملة Break داخل حلقة

هذا هو المنطق الأساسي لجملة break:

  1. تبدأ حلقة while فقط إذا تم تقييم الشرط إلى True.
  2. إذا تم العثور على جملة break في أي نقطة أثناء تنفيذ الحلقة، تتوقف الحلقة فوراً.
  3. وإلا، إذا لم يتم العثور على break، تستمر الحلقة في تنفيذها الطبيعي وتتوقف عندما يتم تقييم الشرط إلى False.

يمكننا استخدام break لإيقاف حلقة while عندما يتم استيفاء شرط في نقطة معينة من تنفيذها، لذلك ستجدها عادةً داخل جملة شرطية، مثل هذا:

while True:
    # Code
    if <condition>:
        break
    # Code

يوقف هذا الحلقة فوراً إذا كان الشرط True.

💡 نصيحة: يمكنك (نظرياً) كتابة جملة break في أي مكان في جسم الحلقة. لا يجب أن تكون بالضرورة جزءاً من شرط، لكننا نستخدمها عادةً لإيقاف الحلقة عندما يكون شرط معين True.

إليك مثال على break في حلقة while True:

مخطط يوضح استخدام جملة Break لإيقاف حلقة While True عند شرط معين

دعنا نرى ذلك بمزيد من التفصيل:

  1. السطر الأول يحدد حلقة while True التي ستعمل إلى أجل غير مسمى حتى يتم العثور على جملة break (أو حتى يتم مقاطعتها بـ CTRL + C).
  2. while True:
  3. السطر الثاني يطلب إدخال المستخدم. يتم تحويل هذا الإدخال إلى عدد صحيح وتعيينه للمتغير user_input.
  4. user_input = int(input("Enter an integer: "))
  5. السطر الثالث يتحقق مما إذا كان الإدخال فردياً.
  6. if user_input % 2 != 0:
  7. إذا كان كذلك، تُطبع الرسالة This number is odd وتوقف جملة break الحلقة فوراً.
  8. print("This number is odd")
    break
  9. وإلا، إذا كان الإدخال زوجياً، تُطبع الرسالة This number is even وتبدأ الحلقة مرة أخرى.
  10. print("This number is even")

ستعمل الحلقة إلى أجل غير مسمى حتى يتم إدخال عدد صحيح فردي، لأن هذه هي الطريقة الوحيدة التي سيتم بها العثور على جملة break. إليك مثال مع إدخال مستخدم مخصص:

Enter an integer: 4
This number is even
Enter an integer: 6
This number is even
Enter an integer: 8
This number is even
Enter an integer: 3
This number is odd
>>>

ملخص

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

عند كتابة حلقة while، يجب عليك إجراء التحديثات اللازمة في الكود الخاص بك للتأكد من أن الحلقة ستتوقف في النهاية. الحلقة اللانهائية هي حلقة تعمل إلى أجل غير مسمى وتتوقف فقط بتدخل خارجي أو عندما يتم العثور على جملة break. يمكنك إيقاف حلقة لانهائية بالضغط على CTRL + C.

يمكنك إنشاء حلقة لانهائية عمداً باستخدام while True. يمكن استخدام جملة break لإيقاف حلقة while فوراً.

آمل أن يكون هذا المقال قد نال إعجابك ووجدته مفيداً. الآن أنت تعرف كيفية العمل مع حلقات التكرار While في بايثون.

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

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

اترك تعليقاً

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