الحلقات التكرارية

عند كتابة الكود، غالباً ما تواجه سيناريوهات تحتاج فيها إلى تكرار نفس الإجراء — طباعة الأرقام من 1 إلى 100، معالجة كل عنصر في قائمة، أو الاستمرار في طلب إدخال المستخدم حتى تحصل على إجابة صالحة.

كتابة 100 سطر من print() لـ 100 رقم غير عملية. هنا تأتي الحلقات التكرارية. توفر بايثون نوعين من الحلقات:


أساسيات حلقة for

حلقة for هي الحلقة الأكثر استخداماً في بايثون. فكرتها الأساسية: خذ عناصر من تسلسل واحداً تلو الآخر، ونفّذ نفس كتلة الكود في كل مرة.

الصيغة الأساسية:

PYTHON
for variable in sequence:
    code to repeat

يتم تعيين المتغير لكل عنصر في التسلسل، ويتم تنفيذ الكتلة ذات المسافة البادئة لكل عنصر.

مثال: التكرار على القوائم والسلاسل النصية (⭐)

PYTHON
# التكرار على قائمة
fruits = ["apple", "banana", "orange", "grape"]
for fruit in fruits:
    print(f"I like {fruit}")

print("---")

# التكرار على سلسلة نصية — الأحرف واحداً تلو الآخر
for char in "Python":
    print(char)
▶ جرّب الكود

المخرجات:

TEXT
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 (⭐)

PYTHON
# اطبع 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
▶ جرّب الكود

مثال: التكرار باستخدام الفهرس (⭐⭐)

PYTHON
students = ["Alice", "Bob", "Charlie", "Diana"]

# احصل على كل من الفهرس والعنصر
for i in range(len(students)):
    print(f"Student {i + 1}: {students[i]}")
▶ جرّب الكود

المخرجات:

TEXT
Student 1: Alice
Student 2: Bob
Student 3: Charlie
Student 4: Diana
💡 طريقة أكثر أناقة: في بايثون، إذا كنت بحاجة إلى كل من الفهرس والعنصر، استخدم enumerate(). سنغطيها في درس لاحق.


حلقة while

الفرق بين while و for: for تعرف عدد مرات التكرار؛ while تعرف فقط متى تتوقف.

الصيغة الأساسية:

PYTHON
while condition:
    code to repeat

قبل كل تكرار، يُفحص الشرط. إذا كان True، تُنفّذ كتلة الكود، ثم يُفحص الشرط مرة أخرى... حتى يصبح False.

مثال: العد التنازلي (⭐)

PYTHON
count = 5
while count > 0:
    print(f"Countdown: {count}")
    count -= 1  # إنقاص بمقدار 1 في كل مرة — مهم جداً!

print("Launch!")
▶ جرّب الكود

المخرجات:

TEXT
Countdown: 5
Countdown: 4
Countdown: 3
Countdown: 2
Countdown: 1
Launch!
⚠️ تحذير الحلقة اللانهائية: إذا نسيت count -= 1، الشرط count > 0 سيكون دائماً True، وسيعمل البرنامج إلى الأبد حتى توقفه قسراً. عند كتابة حلقات while، تأكد دائماً أن الشرط يمكن أن يصبح False في وقت ما.

مثال: استخدام while النموذجي — حتى قيمة محددة (⭐⭐)

PYTHON
# استمر في التنصيف حتى أقل من 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 (⭐)

PYTHON
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 في الممارسة — ابحث وتوقف (⭐⭐)

PYTHON
# ابحث عن أول رقم زوجي في قائمة
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 في الممارسة — معالجة البيانات الصالحة فقط (⭐⭐)

PYTHON
# معالجة الأرقام الموجبة فقط، تخطي السالبة والصفر
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). فكر فيها كـ: "إذا لم تتم مقاطعة الحلقة، شغّل هذا الكود الإضافي."

مثال: التحقق من الرقم الأولي (⭐⭐)

PYTHON
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
▶ جرّب الكود

في هذا المثال:

💡 كثير من المبتدئين يجدون for-else غير بديهي. تذكرها كـ: "else" تعني "إذا لم يحدث break، إذن...".


الحلقات المتداخلة

حلقة داخل حلقة أخرى هي حلقة متداخلة. لكل تكرار من الحلقة الخارجية، تعمل الحلقة الداخلية دورة كاملة.

مثال: جدول الضرب (⭐⭐)

PYTHON
for i in range(1, 10):         # الحلقة الخارجية: الصفوف
    for j in range(1, i + 1):  # الحلقة الداخلية: الأعمدة
        print(f"{j}×{i}={i*j}", end="\t")
    print()  # سطر جديد بعد كل صف
▶ جرّب الكود

المخرجات:

TEXT
1×1=1
1×2=2    2×2=4
1×3=3    2×3=6    3×3=9
...
⚠️ نصيحة أداء: إجمالي عمليات التنفيذ = عدد الحلقات الخارجية × عدد الحلقات الداخلية. التداخل على مستوى N يعني نمواً أسيّاً. كن حذراً مع 3+ مستويات من التداخل عند التعامل مع مجموعات بيانات كبيرة.

مثال: break يؤثر فقط على المستوى الحالي (⭐⭐)

PYTHON
for i in range(1, 4):
    for j in range(1, 10):
        if j > i:
            break  # يوقف فقط الحلقة الداخلية
        print(f"({i},{j})", end=" ")
    print()
▶ جرّب الكود

المخرجات:

TEXT
(1,1)
(2,1) (2,2)
(3,1) (3,2) (3,3)

أمثلة شاملة

مثال 1: لعبة تخمين الرقم (⭐⭐)

يولد النظام رقماً عشوائياً بين 1 و 100. يخمن اللاعب، ويعطي النظام تلميحات ("أعلى" أو "أقل") حتى يخمن اللاعب بشكل صحيح.

PYTHON
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  # اخرج من الحلقة عند التخمين الصحيح
▶ جرّب الكود

النقاط الرئيسية:


حالات الاستخدام الشائعة

السيناريو الحلقة الموصى بها ملاحظات
التكرار على قائمة/صف/مجموعة 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 لإعادة الطلب على إدخال غير صالح
100%