الحلقات التكرارية
عند كتابة الكود، غالباً ما تواجه سيناريوهات تحتاج فيها إلى تكرار نفس الإجراء — طباعة الأرقام من 1 إلى 100، معالجة كل عنصر في قائمة، أو الاستمرار في طلب إدخال المستخدم حتى تحصل على إجابة صالحة.
كتابة 100 سطر من print() لـ 100 رقم غير عملية. هنا تأتي الحلقات التكرارية. توفر بايثون نوعين من الحلقات:
- حلقة
for— لـ "التكرار" على تسلسل (قائمة، سلسلة نصية، range، إلخ.) - حلقة
while— لـ "التنفيذ بينما الشرط صحيح"
أساسيات حلقة for
حلقة for هي الحلقة الأكثر استخداماً في بايثون. فكرتها الأساسية: خذ عناصر من تسلسل واحداً تلو الآخر، ونفّذ نفس كتلة الكود في كل مرة.
الصيغة الأساسية:
for variable in sequence:
code to repeat
يتم تعيين المتغير لكل عنصر في التسلسل، ويتم تنفيذ الكتلة ذات المسافة البادئة لكل عنصر.
مثال: التكرار على القوائم والسلاسل النصية (⭐)
# التكرار على قائمة
fruits = ["apple", "banana", "orange", "grape"]
for fruit in fruits:
print(f"I like {fruit}")
print("---")
# التكرار على سلسلة نصية — الأحرف واحداً تلو الآخر
for char in "Python":
print(char)
المخرجات:
I like apple
I like banana
I like orange
I like grape
---
P
y
t
h
o
n
fruits، استخدم fruit؛ إذا كانت students، استخدم student. يبدو الكود مثل اللغة الطبيعية.
دالة range() — إنشاء تسلسلات الأرقام
عندما تحتاج إلى تكرار عدد ثابت من المرات، range() هي أفضل صديق لك.
range() لها ثلاث صيغ:
| الصيغة | المعنى | مثال | النتيجة |
|---|---|---|---|
range(stop) |
0 ← stop-1 | range(5) |
0,1,2,3,4 |
range(start, stop) |
start ← stop-1 | range(2, 6) |
2,3,4,5 |
range(start, stop, step) |
بخطوة | range(1, 10, 2) |
1,3,5,7,9 |
ملاحظة:
range()لا تشمل قيمة stop — مثل التقطيع، "حتى但不包括."
مثال: التحكم في عدد مرات التكرار باستخدام range (⭐)
# اطبع 1 إلى 5
for i in range(1, 6):
print(f"Loop {i}")
print("---")
# خطوة 2: اطبع الأرقام الزوجية من 0 إلى 10
for i in range(0, 11, 2):
print(i, end=" ") # end=" " يمنع الأسطر الجديدة
# يُخرج: 0 2 4 6 8 10
مثال: التكرار باستخدام الفهرس (⭐⭐)
students = ["Alice", "Bob", "Charlie", "Diana"]
# احصل على كل من الفهرس والعنصر
for i in range(len(students)):
print(f"Student {i + 1}: {students[i]}")
المخرجات:
Student 1: Alice
Student 2: Bob
Student 3: Charlie
Student 4: Diana
enumerate(). سنغطيها في درس لاحق.
حلقة while
الفرق بين while و for: for تعرف عدد مرات التكرار؛ while تعرف فقط متى تتوقف.
الصيغة الأساسية:
while condition:
code to repeat
قبل كل تكرار، يُفحص الشرط. إذا كان True، تُنفّذ كتلة الكود، ثم يُفحص الشرط مرة أخرى... حتى يصبح False.
مثال: العد التنازلي (⭐)
count = 5
while count > 0:
print(f"Countdown: {count}")
count -= 1 # إنقاص بمقدار 1 في كل مرة — مهم جداً!
print("Launch!")
المخرجات:
Countdown: 5
Countdown: 4
Countdown: 3
Countdown: 2
Countdown: 1
Launch!
count -= 1، الشرط count > 0 سيكون دائماً True، وسيعمل البرنامج إلى الأبد حتى توقفه قسراً. عند كتابة حلقات while، تأكد دائماً أن الشرط يمكن أن يصبح False في وقت ما.
مثال: استخدام while النموذجي — حتى قيمة محددة (⭐⭐)
# استمر في التنصيف حتى أقل من 1
num = 100
while num >= 1:
print(num, end=" → ")
num /= 2
# يُخرج: 100 → 50.0 → 25.0 → 12.5 → 6.25 → 3.125 → 1.5625 → 0.78125
هذا يظهر قوة while: لا نعرف مسبقاً كم عدد التكرارات المطلوبة — نعرف فقط متى نتوقف.
break و continue — الفرامل والتخطي
break — اخرج من الحلقة فوراً
عندما يتحقق شرط، break يقفز خارج الحلقة بأكملها، متجاهلاً أي تكرارات متبقية.
continue — تخطى التكرار الحالي
عندما يتحقق شرط، continue يتخطى بقية التكرار الحالي وينتقل إلى التالي.
مثال: break مقابل continue (⭐)
print("=== break example ===")
for i in range(1, 10):
if i == 5:
break # أنهِ الحلقة عند الوصول إلى 5
print(i, end=" ")
# يُخرج: 1 2 3 4
print("\n=== continue example ===")
for i in range(1, 10):
if i == 5:
continue # تخطى 5، استمر مع الباقي
print(i, end=" ")
# يُخرج: 1 2 3 4 6 7 8 9
مثال: break في الممارسة — ابحث وتوقف (⭐⭐)
# ابحث عن أول رقم زوجي في قائمة
numbers = [3, 7, 9, 2, 5, 8, 1]
for num in numbers:
if num % 2 == 0:
print(f"Found first even number: {num}")
break # توقف عن البحث بمجرد العثور عليه
else:
print("No even numbers in the list") # هذا else ينتمي إلى حلقة for
مثال: continue في الممارسة — معالجة البيانات الصالحة فقط (⭐⭐)
# معالجة الأرقام الموجبة فقط، تخطي السالبة والصفر
data = [3, -5, 0, 8, -2, 7, 0, 4]
positive_sum = 0
for num in data:
if num <= 0:
continue # تخطي البيانات غير الصالحة
positive_sum += num
print(f"Sum of positive numbers: {positive_sum}") # يُخرج: 22 (3+8+7+4)
for-else و while-else — "مكافأة الإكمال العادي"
هذه ميزة فريدة في بناء جملة بايثون، غير موجودة في العديد من اللغات الأخرى.
كتلة else تُنفّذ عندما تُكمل الحلقة بشكل طبيعي (بدون مقاطعة بواسطة break). فكر فيها كـ: "إذا لم تتم مقاطعة الحلقة، شغّل هذا الكود الإضافي."
مثال: التحقق من الرقم الأولي (⭐⭐)
num = 17
for i in range(2, num):
if num % i == 0:
print(f"{num} is not prime, divisible by {i}")
break
else:
print(f"{num} is prime!") # يُنفّذ فقط إذا لم يحدث break
في هذا المثال:
- إذا تم العثور على قاسم، يتم تشغيل
break، ولا يعملelse - إذا لم يتم العثور على قاسم بعد فحص جميع الاحتمالات، تنتهي الحلقة بشكل طبيعي، ويعمل
else
for-else غير بديهي. تذكرها كـ: "else" تعني "إذا لم يحدث break، إذن...".
الحلقات المتداخلة
حلقة داخل حلقة أخرى هي حلقة متداخلة. لكل تكرار من الحلقة الخارجية، تعمل الحلقة الداخلية دورة كاملة.
مثال: جدول الضرب (⭐⭐)
for i in range(1, 10): # الحلقة الخارجية: الصفوف
for j in range(1, i + 1): # الحلقة الداخلية: الأعمدة
print(f"{j}×{i}={i*j}", end="\t")
print() # سطر جديد بعد كل صف
المخرجات:
1×1=1
1×2=2 2×2=4
1×3=3 2×3=6 3×3=9
...
مثال: break يؤثر فقط على المستوى الحالي (⭐⭐)
for i in range(1, 4):
for j in range(1, 10):
if j > i:
break # يوقف فقط الحلقة الداخلية
print(f"({i},{j})", end=" ")
print()
المخرجات:
(1,1)
(2,1) (2,2)
(3,1) (3,2) (3,3)
أمثلة شاملة
مثال 1: لعبة تخمين الرقم (⭐⭐)
يولد النظام رقماً عشوائياً بين 1 و 100. يخمن اللاعب، ويعطي النظام تلميحات ("أعلى" أو "أقل") حتى يخمن اللاعب بشكل صحيح.
import random
# أنشئ هدفاً عشوائياً
target = random.randint(1, 100)
attempts = 0
print("🎯 Guess the Number! I'm thinking of a number between 1 and 100.")
while True: # حلقة لا نهائية، اخرج عبر break
try:
guess = int(input("Enter your guess: "))
except ValueError:
print("Please enter a valid number!")
continue
attempts += 1
if guess < target:
print("Too low, try higher!")
elif guess > target:
print("Too high, try lower!")
else:
print(f"🎉 Congratulations! It's {target}!")
print(f"You guessed it in {attempts} attempts.")
break # اخرج من الحلقة عند التخمين الصحيح
النقاط الرئيسية:
while Trueمعbreakنمط شائع جداً في بايثونtry-exceptيلتقط الإدخال غير الرقمي،continueيطلب من المستخدم مرة أخرىbreakيخرج من الحلقة عند التخمين الصحيح
حالات الاستخدام الشائعة
| السيناريو | الحلقة الموصى بها | ملاحظات |
|---|---|---|
| التكرار على قائمة/صف/مجموعة | for |
معالجة العناصر واحداً تلو الآخر |
| التكرار على أزواج المفاتيح-القيم في القاموس | for |
استخدم .items() |
| كرر N مرة | for + range() |
عدد ثابت من التكرارات |
| حتى يتحقق الشرط | while |
عدد غير معروف من التكرارات |
| قراءة ملف حتى EOF | for / while |
كائنات الملف قابلة للتكرار |
| التحقق من صحة إدخال المستخدم | while + break |
حلقة حتى إدخال صالح |
| حلقة لا نهائية (خادم، حلقة لعبة) | while True |
اخرج عبر break |
❓ أسئلة شائعة
for مقابل while؟for عندما تعرف عدد التكرارات (التكرار على قوائم/نطاقات/سلاسل نصية). استخدم while عندما تعرف شرط التوقف (انتظار إدخال، الاقتراب من قيمة). غالباً ما يمكن تبديلهما، لكن اختيار الصحيح يجعل الكود أوضح.
⚠️ س:هل for i in range(len(list)) بايثونية؟ ج:ليس حقاً. تفضل بايثون التكرار المباشر: for item in list. استخدم range(len(...)) فقط عندما تحتاج تحديداً إلى الفهارس — وحتى ذلك الحين، enumerate() أكثر أناقة.
س:ماذا لو كان لدي حلقات متداخلة كثيرة جداً؟ ج:التداخل فوق 3 مستويات يضر بقابلية القراءة. الحلول: استخرج الحلقات الداخلية إلى دوال، استخدم itertools للتوافيق، أو أعد التفكير في الخوارزمية.📖 ملخص
- حلقة
forتتكرر على التسلسلات (قوائم، سلاسل نصية، range، إلخ.) range(start, stop, step)يُنشئ تسلسلات أرقام؛ stop غير شامل؛ step يمكن أن يكون سالباً- حلقة
whileمدفوعة بالشرط؛ تجنب الحلقات اللانهائية breakيخرج من الحلقة بأكملها؛continueيتخطى التكرار الحاليfor-else/while-else— خاص ببايثون؛elseيعمل عندما لم يتم الخروج من الحلقة عبرbreak- الحلقات المتداخلة: كل تكرار خارجي يُشغّل حلقة داخلية كاملة؛ المجموع = حاصل ضرب الأعداد
📝 تمارين
⭐ تمرين 1: مجموع الأرقام الزوجية
استخدم حلقة for و range() لحساب مجموع جميع الأرقام الزوجية بين 1 و 100.
تلميح: range(2, 101, 2) يوصلك إلى هناك في خطوة واحدة.
⭐⭐ تمرين 2: متتالية فيبوناتشي
التعريف: أول رقمين هما 1، وكل رقم لاحق هو مجموع الرقمين السابقين. المتتالية: 1, 1, 2, 3, 5, 8, 13, 21, ...
استخدم حلقة while لإخراج جميع أرقام فيبوناتشي التي لا تتجاوز 1000.
تلميح: استخدم ثلاثة متغيرات a, b للرقمين الحاليين، احسب a + b للتالي، ثم انقل.
⭐⭐⭐ تمرين 3: آلة حاسبة بسيطة
اكتب برنامجاً يطلب مراراً رقمين وعامل (+، -، *، /)، ويخرج النتيجة.
أدخل q للخروج.
المتطلبات:
- استخدم
while Trueوbreak - تعامل مع القسمة على صفر
- تعامل مع العوامل غير الصالحة (أظهر تلميحاً، لا تخرج)
- استخدم
continueلإعادة الطلب على إدخال غير صالح



