PyDA Course
📖 درس 9 مبتدئ ⏱ 18 دقيقة ⚡ +10 XP ColabKagglenbviewerBinderDeepnoteGitHub for · while · loops · break · continue

حلقات For و While

كرّر الإجراءات على المتتاليات وحتى تتغير الشروط.

🎯 ماذا ستتعلم:
  • التكرار عبر القوائم والسلاسل والمدى باستخدام حلقات for
  • استخدام حلقات while للتكرار المبني على الشروط
  • التحكم في تدفق الحلقة باستخدام break و continue و pass
  • تجنب الحلقات اللانهائية

الآلتان اللتان تكرران

اكتب برنامجًا يجمع أول مئة عددٍ صحيح وستتشنج يداك. جرّد الرياضيون التكرارَ في رمزٍ قبل وجود الحواسيب بزمنٍ طويل:

i=1100i=1+2++100\sum_{i=1}^{100} i = 1 + 2 + \cdots + 100

علامة \sum تعليمةٌ بالتكرار. والحلقة هي \sum الحاسوب ، وتقسم بايثون الفكرة إلى آلتين لنوعين من التكرار. تكرّر for عبر متتاليةٍ معلومة. وتكرّر while حتى يكفّ شرطٌ عن الصحة.

For: تكرارٌ عبر متتالية

تزور حلقة for كل عنصرٍ في المتتالية، عنصرٌ لكل جولة:

python
for fruit in ["apple", "banana", "cherry"]:
    print(fruit)
# apple
# banana
# cherry

اقرأها كما تعمل: «لكل فاكهةٍ في القائمة افعل هذا.» تأخذ متغير الحلقة، fruit، قيمةً جديدةً كل جولة حتى تنفد القائمة.

السلاسل متتالياتٌ أيضًا ، وعناصرُها حروف:

python
for letter in "Python":
    print(letter)

ولأن الحرف عنصرٌ واحد، يتفق الرياضي والآلة: التكرار عبر سلسلةٍ طولِها nn يشغّل nn جولةً بالضبط.

المتتالية العددية: range

معظم المجاميع تجري فوق الأعداد، لذا تقدّم بايثونrange ، متتاليةً يمكنك تجاوزُها قفزاتٍ:

python
for n in range(5):
    print(n)   # 0 1 2 3 4

تُنتج range(5) المتتاليةَ الحسابية 0,1,2,3,40, 1, 2, 3, 4، مثل مجموعة فهارس i=04ai\sum_{i=0}^{4} a_i. وبوسيطين إضافيين تأخذ الشكلَ الذي تريد: تمشي range(start, stop, step) من start بخطواتِ step، وتتوقف قبل stop:

python
for n in range(10, 0, -2):
    print(n)   # 10 8 6 4 2

يقول قاعدةُ التوقف بدقة: يسير nn ما دام n<stopn < \text{stop} (أو n>stopn > \text{stop} مع خطوةٍ سالبة)، كفترةٍ شبه مفتوحة [start,stop)[\text{start}, \text{stop}).

While: تكرارٌ حتى شرطٍ

بعض المهام لا يمكن حصر جولاتها مسبقًا ، تواصل حتى ينقلب شرطٌ ما. تقريب نيوتن هو النموذج: صَقّل حتى يهبط التغير تحت سماحةٍ معينة. تلك حلقة while:

python
count = 0
while count < 5:
    print(count)
    count += 1
# 0 1 2 3 4

الشرط في الأعلى ويُعاد فحصه كل جولة. تأكد أنه سينقلب إلى False في النهاية ، فإذا لم يغيّر شيءٌ داخل الجسم المتغيراتِ التي يقرؤها الشرط، لن تنتهي الحلقة أبدًا. المجموع الذي لا بد أن ينتهي يُكتب بـ for؛ والبحث الذي لا ينتهي إلا بإيجاد جوابه يُكتب بـ while.

Break و continue

كلمتان تضبطان التدفق من الداخل.

تتخلى break عن الحلقة فورًا، مهما بقي من جولات:

python
for n in [1, 3, 4, 7, 8]:
    if n % 2 == 0:
        print(f"Found even: {n}")
        break

تتخلى continue عن هذه الجولة فقط، قافزةً إلى التالية:

python
for n in range(6):
    if n % 2 != 0:
        continue
    print(n)  # 0 2 4

بينهما تنطبق المفاهيم على خط الأعداد: تقطع break الذيلَ {nZ:nm}\{n \in \mathbb{Z} : n \geq m\}؛ وتنحت continue مجموعةً فرعيةً من الجولات، كغربلةِ متناقلةٍ بمنخل.

Pass: مكانٌ شاغر

كل جسمٍ من if أو for أو while أو دالةٍ يحتاج جملةً واحدةً على الأقل، لكنك أحيانًا لم تكتبها بعد. pass هو اللافعلُ الذي يشغل المكان:

python
for n in range(10):
    if n % 3 == 0:
        pass  # TODO: handle multiples of 3 later
    else:
        print(n)

لا يفعل شيئًا ، وهذا هو عمله بالضبط: أن يُبقي الكتلة سليمةً نحو قواعد اللغة بينما تُصاغ الجملة الحقيقية.

مثالٌ محلول: آلةُ Σ تعملُ

تتألفُ أدواتُ هذا الدرسِ في رمزِ الجمعِ الواردِ في الافتتاح:

python
total = 0
for n in range(1, 11):
    if n % 2 != 0:
        continue          # الأزواجُ فقط
    total += n
print(total)              # 2 + 4 + 6 + 8 + 10 = 30

الحلقةُ هي \sum مُيكنةً: كلُّ دورةٍ تجمع حدًّا، ويغربلُ continue الأدوارَ الفرديةَ، ويتراكمُ total كما تراكم المجموعُ المتصاعدُ في الدرسِ الثاني.

أخطاء شائعة

  • حلقات while اللانهائية. انسَ تحديث المتغير الذي يقرؤه الشرط فتدور الحلقة بلا نهاية. تحقق أن الجسم يحرّك الحالة نحو False.
  • تعديل قائمةٍ أثناء التكرار عليها. القطعُ أو الحذف في منتصف الطريق يزاح الفهارس تحت قدميك. كرّر على نسخةٍ، أو ابنِ قائمةً جديدة.
  • for i in range(len(items)). ما لم تكن تحتاج إلى الفهرس نفسه، كرّر فوق المتتالية مباشرة ، «for fruit in fruits» يقول ما تقصد.
  • يتجاوز continue الدورةَ، ويهجرُها break جملةً. يتجاوز continue التكرارَ الحاليَّ فقط؛ وينهي break الحلقةَ كلَّها. والخلطُ بينهما هو كيفَ يواصلُ دورانَهُ برجٌ كان عليه أن يقف.

🧩 تحديات

🧩 تحدٍّ ، فكّر أولًا ثم أظهر

اكتب حلقة for تطبع أول عشرة مضاعفاتٍ للثلاثة: 3,6,9,,303, 6, 9, \ldots, 30.

💡 الجواب: for i in range(3, 31, 3): print(i) ، تبدأ `range(3, 31, 3)` عند 3 وتتقدم ثلاثًا ثلاثًا وتتوقف قبل 31، فتحطّ بالضبط على $3, 6, \ldots, 30$.

🧩 تحدٍّ ، فكّر أولًا ثم أظهر

اكتب حلقة while تمشي عبر طابورٍ (حاكِها بقائمةٍ) وتتوقف عند العنصر "quit"، مطبعةً كل عنصرٍ تعبر عليه.

💡 الجواب: inputs = ["hello", "world", "quit"]; i = 0; while inputs[i] != "quit": print(inputs[i]); i += 1 ، الشرط يحرس الحارسَ، والفهرس يحرّك الحالة نحوه.

🤔 أسئلة سقراطية

  • متى تلجأ إلى while عوضًا عن for؟ أعط مهمةً حقيقيةً لكلٍّ منهما ، إحداهما تعدّها مسبقًا، والأخرى لا.
  • ماذا يحدث لقائمةٍ تعدّلها بينما حلقة for تمشي عليها؟ وكيف تتجاوز الأمر؟
  • لا تملك بايثون do…while كما في C. كيف تكتب جسمًا يجب أن يعمل مرةً واحدةً على الأقل قبل فحص أي شرط؟

✅ فحص سريع

١. ماذا تطبع for i in range(0, 10, 3): print(i, end=" ")؟

٢. أيُّ كلمةٍ تتخطى بقيةَ الجولة الحالية من الحلقة؟

forwhileloopsbreakcontinue