حلقات For و While
كرّر الإجراءات على المتتاليات وحتى تتغير الشروط.
- التكرار عبر القوائم والسلاسل والمدى باستخدام حلقات for
- استخدام حلقات while للتكرار المبني على الشروط
- التحكم في تدفق الحلقة باستخدام break و continue و pass
- تجنب الحلقات اللانهائية
الآلتان اللتان تكرران
اكتب برنامجًا يجمع أول مئة عددٍ صحيح وستتشنج يداك. جرّد الرياضيون التكرارَ في رمزٍ قبل وجود الحواسيب بزمنٍ طويل:
علامة تعليمةٌ بالتكرار. والحلقة هي الحاسوب ، وتقسم بايثون الفكرة إلى آلتين لنوعين من التكرار. تكرّر for عبر متتاليةٍ معلومة. وتكرّر while حتى يكفّ شرطٌ عن الصحة.
For: تكرارٌ عبر متتالية
تزور حلقة for كل عنصرٍ في المتتالية، عنصرٌ لكل جولة:
for fruit in ["apple", "banana", "cherry"]:
print(fruit)
# apple
# banana
# cherryاقرأها كما تعمل: «لكل فاكهةٍ في القائمة افعل هذا.» تأخذ متغير الحلقة، fruit، قيمةً جديدةً كل جولة حتى تنفد القائمة.
السلاسل متتالياتٌ أيضًا ، وعناصرُها حروف:
for letter in "Python":
print(letter)ولأن الحرف عنصرٌ واحد، يتفق الرياضي والآلة: التكرار عبر سلسلةٍ طولِها يشغّل جولةً بالضبط.
المتتالية العددية: range
معظم المجاميع تجري فوق الأعداد، لذا تقدّم بايثونrange ، متتاليةً يمكنك تجاوزُها قفزاتٍ:
for n in range(5):
print(n) # 0 1 2 3 4تُنتج range(5) المتتاليةَ الحسابية ، مثل مجموعة فهارس . وبوسيطين إضافيين تأخذ الشكلَ الذي تريد: تمشي range(start, stop, step) من start بخطواتِ step، وتتوقف قبل stop:
for n in range(10, 0, -2):
print(n) # 10 8 6 4 2يقول قاعدةُ التوقف بدقة: يسير ما دام (أو مع خطوةٍ سالبة)، كفترةٍ شبه مفتوحة .
While: تكرارٌ حتى شرطٍ
بعض المهام لا يمكن حصر جولاتها مسبقًا ، تواصل حتى ينقلب شرطٌ ما. تقريب نيوتن هو النموذج: صَقّل حتى يهبط التغير تحت سماحةٍ معينة. تلك حلقة while:
count = 0
while count < 5:
print(count)
count += 1
# 0 1 2 3 4الشرط في الأعلى ويُعاد فحصه كل جولة. تأكد أنه سينقلب إلى False في النهاية ، فإذا لم يغيّر شيءٌ داخل الجسم المتغيراتِ التي يقرؤها الشرط، لن تنتهي الحلقة أبدًا. المجموع الذي لا بد أن ينتهي يُكتب بـ for؛ والبحث الذي لا ينتهي إلا بإيجاد جوابه يُكتب بـ while.
Break و continue
كلمتان تضبطان التدفق من الداخل.
تتخلى break عن الحلقة فورًا، مهما بقي من جولات:
for n in [1, 3, 4, 7, 8]:
if n % 2 == 0:
print(f"Found even: {n}")
breakتتخلى continue عن هذه الجولة فقط، قافزةً إلى التالية:
for n in range(6):
if n % 2 != 0:
continue
print(n) # 0 2 4بينهما تنطبق المفاهيم على خط الأعداد: تقطع break الذيلَ ؛ وتنحت continue مجموعةً فرعيةً من الجولات، كغربلةِ متناقلةٍ بمنخل.
Pass: مكانٌ شاغر
كل جسمٍ من if أو for أو while أو دالةٍ يحتاج جملةً واحدةً على الأقل، لكنك أحيانًا لم تكتبها بعد. pass هو اللافعلُ الذي يشغل المكان:
for n in range(10):
if n % 3 == 0:
pass # TODO: handle multiples of 3 later
else:
print(n)لا يفعل شيئًا ، وهذا هو عمله بالضبط: أن يُبقي الكتلة سليمةً نحو قواعد اللغة بينما تُصاغ الجملة الحقيقية.
مثالٌ محلول: آلةُ Σ تعملُ
تتألفُ أدواتُ هذا الدرسِ في رمزِ الجمعِ الواردِ في الافتتاح:
total = 0
for n in range(1, 11):
if n % 2 != 0:
continue # الأزواجُ فقط
total += n
print(total) # 2 + 4 + 6 + 8 + 10 = 30الحلقةُ هي مُيكنةً: كلُّ دورةٍ تجمع حدًّا، ويغربلُ continue الأدوارَ الفرديةَ، ويتراكمُ total كما تراكم المجموعُ المتصاعدُ في الدرسِ الثاني.
أخطاء شائعة
- حلقات
whileاللانهائية. انسَ تحديث المتغير الذي يقرؤه الشرط فتدور الحلقة بلا نهاية. تحقق أن الجسم يحرّك الحالة نحوFalse. - تعديل قائمةٍ أثناء التكرار عليها. القطعُ أو الحذف في منتصف الطريق يزاح الفهارس تحت قدميك. كرّر على نسخةٍ، أو ابنِ قائمةً جديدة.
for i in range(len(items)). ما لم تكن تحتاج إلى الفهرس نفسه، كرّر فوق المتتالية مباشرة ، «for fruit in fruits» يقول ما تقصد.- يتجاوز
continueالدورةَ، ويهجرُهاbreakجملةً. يتجاوزcontinueالتكرارَ الحاليَّ فقط؛ وينهيbreakالحلقةَ كلَّها. والخلطُ بينهما هو كيفَ يواصلُ دورانَهُ برجٌ كان عليه أن يقف.
🧩 تحديات
🧩 تحدٍّ ، فكّر أولًا ثم أظهر
اكتب حلقة for تطبع أول عشرة مضاعفاتٍ للثلاثة: .
💡 الجواب: 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=" ")؟
٢. أيُّ كلمةٍ تتخطى بقيةَ الجولة الحالية من الحلقة؟