الفصل 10

حلقات while — التكرار طالما تحقق الشرط

تكرار العمل، كيف تحدث الحلقات اللانهائية وكيفية إيقافها، أوامر break و continue، وإعادة السؤال حتى إدخال قيمة صحيحة.

35 دقيقةPython 3.12
  1. 1المشكلة
  2. 2الفهم
  3. 3أمثلة محلولة
  4. 4التوقع
  5. 5التطبيق
  6. 6التحدي

المشكلة التي نقوم بحلها

في الدرس السابق تعلمنا كيفية التقاط المدخلات غير الصالحة — فعندما يكتب شخص ما twenty، يستطيع البرنامج أن يطبع: "هذا ليس رقماً".

ولكن ماذا يفعل البرنامج بعد طباعة ذلك؟ يتوقف تماماً! ويضطر المستخدم لتشغيل البرنامج من البداية. لا يوجد برنامج حقيقي يعمل بهذه الطريقة — فالبرامج الحقيقية تُعيد السؤال وتستمر في ذلك حتى تحصل على إجابة صحيحة مقبولة.

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

في نهاية هذا الدرس ستكون قادراً على

  • كتابة حلقة while ومعرفة متى ستتوقف بدقة
  • فهم أسباب حدوث الحلقات اللانهائية وإيقافها باستخدام Ctrl + C
  • تجميع القيم والعدادات داخل الحلقة
  • استخدام break و continue في الأماكن المناسبة
  • مواصلة السؤال حتى تصبح المدخلات صالحة

المتطلبات السابقة: اتخاذ القرارات — if و elif و else.


أبسط صورة لحلقة while

python
count = 3

while count > 0:
    print(count)
    count = count - 1

print("Go")
text
3
2
1
Go

الشكل يشبه تماماً جملة if — شرط، نقطتان رأسيتان، وكتلة مُزاحة بمسافة بادئة. الفرق الجوهري هو: if تفحص الشرط مرة واحدة فقط؛ بينما while تعيد فحص الشرط في كل مرة تنتهي فيها من تنفيذ الكتلة البرمجية.

تتطلب كل حلقة تكرارية ثلاثة عناصر أساسية:

  • قيمة ابتدائية — قبل الحلقة (count = 3)
  • شرط استمرار — يحدد متى تستمر الحلقة (count > 0)
  • تعديل وتغيير — أمر داخل الكتلة يؤدي في النهاية لجعل الشرط خاطئاً (count = count - 1)

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

إذا سقط العنصر الثالث:

python
count = 3

while count > 0:
    print(count)

سيستمر هذا الكود في طباعة الرقم 3 إلى ما لا نهاية.

كيفية إيقاف البرنامج: اضغط Ctrl + C في الطرفية. سيتوقف البرنامج فوراً وتظهر رسالة KeyboardInterrupt.

الحلقات اللانهائية جزء طبيعي من تعلم البرمجة. كل مبرمج كتب حلقات لانهائية في بداياته. لا تقلق، فقط تذكر Ctrl + C. وعند كتابة أي حلقة، اسأل نفسك دائماً: "كيف سيصبح هذا الشرط زائفاً False؟"

تجميع القيم (Accumulation)

أحد أهم استخدامات الحلقات هو حساب مجموع أو عداد:

python
total = 0
number = 1

while number <= 5:
    total = total + number
    number = number + 1

print("Sum of 1 to 5:", total)
text
Sum of 1 to 5: 15

المتغير total يُسمى "المُجمِّع" (Accumulator). لاحظ أنه يبدأ من خارج الحلقة بقيمة 0.

أمر break — الخروج الفوري

ينهي أمر break الحلقة فوراً دون انتظار فحص الشرط:

python
number = 1

while number <= 100:
    if number % 7 == 0:
        print("First multiple of 7:", number)
        break
    number = number + 1
text
First multiple of 7: 7

يتيح لنا أمر break استخدام النمط الشائع while True:

python
while True:
    answer = input("Type 'quit' to exit: ").strip().lower()
    if answer == "quit":
        print("Goodbye")
        break
    print(f"You typed: {answer}")
text
Type 'quit' to exit: hello
You typed: hello
Type 'quit' to exit: QUIT
Goodbye

أمر continue — تخطي الدورة الحالية

لا ينهي أمر continue الحلقة؛ بل يتخطى ما تبقى من الكتلة البرمجية في الدورة الحالية وينتقل فوراً للدورة التالية:

python
number = 0

while number < 10:
    number = number + 1
    if number % 2 == 0:
        continue
    print(number)
text
1
3
5
7
9
تنبيه: إذا كان سطر زيادة العداد (number = number + 1) يقع بعد continue، فسيتم تخطيه وتدخل الحلقة في تكرار لانهائي.

الاستمرار في السؤال حتى تصبح المدخلات صالحة

python
while True:
    raw = input("Your age: ").strip()
    if raw.isdigit():
        age = int(raw)
        break
    print("Please type a whole number, digits only.")

print(f"Thank you. Age recorded as {age}.")
text
Your age: twenty
Please type a whole number, digits only.
Your age: 22.5
Please type a whole number, digits only.
Your age: 22
Thank you. Age recorded as 22.

مثال عملي متكامل

ملف shopping.py:

python
# Keep taking item prices until the user is done, then summarise
total = 0.0
item_count = 0

print("Enter item prices. Type 'done' to finish.")

while True:
    entry = input("Price: ").strip().lower()

    if entry == "done":
        break

    if entry == "":
        print("  Nothing typed — try again.")
        continue

    # Accept only digits and at most one decimal point
    if entry.replace(".", "", 1).isdigit():
        price = float(entry)
        total = total + price
        item_count = item_count + 1
        print(f"  Added {price:.2f}. Running total {total:.2f}")
    else:
        print(f"  '{entry}' is not a price. Try again.")

print()
if item_count == 0:
    print("No items were entered.")
else:
    average = total / item_count
    print(f"Items   : {item_count}")
    print(f"Total   : {total:.2f}")
    print(f"Average : {average:.2f}")
text
Enter item prices. Type 'done' to finish.
Price: 120
  Added 120.00. Running total 120.00
Price: abc
  'abc' is not a price. Try again.
Price: 85.5
  Added 85.50. Running total 205.50
Price: done

Items   : 2
Total   : 205.50
Average : 102.75

حالات الخطأ الشائعة

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

الحلقة لم تنفّذ إطلاقاً الشرط كان خاطئاً منذ البداية. افحص القيمة الابتدائية.

IndentationError السطر الذي يلي while لم يُزح بمسافة بادئة صحيحة.