حلقة التكرار for (For Loop)

تخيل أنك مدير مصنع تحتاج لفحص جودة 1000 منتج. هل ستكتب أمر الفحص ألف مرة؟ بالطبع لا. في عالم البرمجة، نواجه باستمرار مهام تتطلب تكرار نفس العملية على مجموعة من العناصر: إرسال رسائل لقائمة من المستخدمين، حساب مجموع أرقام، معالجة ملفات متعددة، أو عرض بيانات من قاعدة بيانات. هنا تأتي قوة حلقات التكرار.

حلقة for في بايثون هي الأداة الأساسية والأكثر استخداماً للتكرار. تتميز بايثون بأسلوب تكرار أنيق وقريب من اللغة الطبيعية، حيث نقول حرفياً: "لكل عنصر في هذه المجموعة، افعل كذا". هذا الأسلوب يجعل الكود أقصر وأوضح وأقل عرضة للأخطاء مقارنة بلغات البرمجة الأخرى.

في هذا الدرس المفصل، ستتعلم كل ما تحتاجه عن حلقة for: من المفاهيم الأساسية إلى التقنيات المتقدمة، مع أمثلة عملية متنوعة تغطي سيناريوهات واقعية.

1. مفهوم التكرار (Iteration) في البرمجة

التكرار هو أحد المفاهيم الأساسية في البرمجة. يعني ببساطة تنفيذ مجموعة من الأوامر عدة مرات. بدون التكرار، ستضطر لكتابة نفس الكود مراراً، مما يجعل البرنامج طويلاً وصعب الصيانة ومعرضاً للأخطاء.

في بايثون، حلقة for مصممة خصيصاً لما يسمى "التكرار المحدد" (Definite Iteration)، أي التكرار لعدد معروف مسبقاً من المرات أو على عناصر مجموعة محددة. هذا يختلف عن حلقة while التي سنتعلمها لاحقاً والتي تستخدم للتكرار غير المحدد.

لماذا نحتاج التكرار؟

  • تقليل حجم الكود: بدلاً من كتابة 100 سطر، تكتب 3 أسطر فقط
  • سهولة الصيانة: التعديل في مكان واحد ينعكس على كل التكرارات
  • تقليل الأخطاء: نسخ ولصق الكود يؤدي لأخطاء، التكرار يتجنب ذلك
  • المرونة: يمكن تغيير عدد التكرارات بسهولة دون تعديل الكود
  • معالجة البيانات الديناميكية: التعامل مع بيانات متغيرة الحجم

2. الصيغة الأساسية لحلقة for

تتكون حلقة for من عدة أجزاء: الكلمة المفتاحية for، متغير التكرار، الكلمة المفتاحية in، الكائن القابل للتكرار (Iterable)، ثم نقطتان رأسيتان. الكود المراد تكراره يكتب في السطور التالية مع إزاحة للداخل.

basic_for_syntax.py
# الصيغة العامة:
# for variable in iterable:
#     code_block

# مثال أساسي: التكرار على قائمة
fruits = ["Apple", "Banana", "Cherry", "Date", "Elderberry"]

print("قائمة الفواكه المتاحة:")
print("-" * 30)

for fruit in fruits:
    print("- " + fruit)

print("-" * 30)
print("انتهى عرض القائمة")
النتيجة
قائمة الفواكه المتاحة: ------------------------------ - Apple - Banana - Cherry - Date - Elderberry ------------------------------ انتهى عرض القائمة

تحليل الكود خطوة بخطوة

  1. تعريف القائمة: أنشأنا قائمة fruits تحتوي على 5 عناصر
  2. بداية الحلقة: for fruit in fruits تبدأ التكرار
  3. الدورة الأولى: المتغير fruit يأخذ القيمة "Apple"
  4. تنفيذ الكود: يتم طباعة "- Apple"
  5. الدورة الثانية: المتغير fruit يأخذ القيمة "Banana"
  6. وهكذا... حتى تنتهي جميع العناصر
  7. الخروج من الحلقة: بعد آخر عنصر، ينتقل التنفيذ للكود التالي

3. دالة range: توليد تسلسلات الأرقام

دالة range() هي من أهم الأدوات المستخدمة مع حلقة for. تقوم بتوليد تسلسل من الأرقام الصحيحة، وهي مفيدة جداً عندما تريد تكرار كود عدد محدد من المرات أو عندما تحتاج للأرقام نفسها داخل الحلقة.

الأشكال الثلاثة لدالة range

الصيغة الوصف مثال النتيجة
range(stop) من 0 إلى stop-1 range(5) 0, 1, 2, 3, 4
range(start, stop) من start إلى stop-1 range(2, 7) 2, 3, 4, 5, 6
range(start, stop, step) من start إلى stop-1 بخطوة step range(0, 10, 2) 0, 2, 4, 6, 8
range_examples.py
# الشكل الأول: range(stop)
print("العد من 0 إلى 4:")
for i in range(5):
    print(f"  العدد: {i}")

# الشكل الثاني: range(start, stop)
print("\nالعد من 1 إلى 5:")
for i in range(1, 6):
    print(f"  العدد: {i}")

# الشكل الثالث: range(start, stop, step)
print("\nالأرقام الزوجية من 0 إلى 10:")
for i in range(0, 11, 2):
    print(f"  العدد: {i}")

# العد التنازلي باستخدام خطوة سالبة
print("\nالعد التنازلي من 10 إلى 1:")
for i in range(10, 0, -1):
    print(f"  العدد: {i}")
النتيجة
العد من 0 إلى 4: العدد: 0 العدد: 1 العدد: 2 العدد: 3 العدد: 4 العد من 1 إلى 5: العدد: 1 العدد: 2 العدد: 3 العدد: 4 العدد: 5 الأرقام الزوجية من 0 إلى 10: العدد: 0 العدد: 2 العدد: 4 العدد: 6 العدد: 8 العدد: 10 العد التنازلي من 10 إلى 1: العدد: 10 العدد: 9 العدد: 8 العدد: 7 العدد: 6 العدد: 5 العدد: 4 العدد: 3 العدد: 2 العدد: 1
ملاحظة مهمة: دالة range() لا تخزن كل الأرقام في الذاكرة مرة واحدة، بل تولدها عند الحاجة. هذا يجعلها فعالة جداً حتى مع الأرقام الكبيرة مثل range(1000000).

4. التكرار على أنواع البيانات المختلفة

من أقوى ميزات حلقة for في بايثون قدرتها على التكرار على أي كائن قابل للتكرار (Iterable). هذا يشمل القوائم، النصوص، المجموعات، القواميس، وحتى الملفات.

التكرار على النصوص (Strings)

النص في بايثون هو سلسلة من الأحرف، ويمكن التكرار على كل حرف فيه بشكل منفصل. هذا مفيد جداً لمعالجة النصوص وتحليلها.

string_iteration.py
# التكرار على أحرف كلمة
word = "Python"

print("تحليل كلمة Python:")
print("-" * 25)

for index, char in enumerate(word):
    print(f"الحرف رقم {index + 1}: {char}")

# حساب عدد الحروف المتحركة
text = "Programming is amazing"
vowels = "aeiouAEIOU"
vowel_count = 0

for char in text:
    if char in vowels:
        vowel_count += 1

print(f"\nالنص: {text}")
print(f"عدد الحروف المتحركة: {vowel_count}")
النتيجة
تحليل كلمة Python: ------------------------- الحرف رقم 1: P الحرف رقم 2: y الحرف رقم 3: t الحرف رقم 4: h الحرف رقم 5: o الحرف رقم 6: n النص: Programming is amazing عدد الحروف المتحركة: 6

التكرار على القواميس (Dictionaries)

القواميس تحتوي على أزواج من المفاتيح والقيم. يمكن التكرار على المفاتيح فقط، القيم فقط، أو كليهما معاً.

dictionary_iteration.py
# قاموس يحتوي على درجات الطلاب
student_grades = {
    "Ahmed": 85,
    "Sara": 92,
    "Mohammed": 78,
    "Fatima": 95,
    "Omar": 88
}

print("تقرير درجات الطلاب")
print("=" * 35)

# التكرار على المفاتيح والقيم معاً
for name, grade in student_grades.items():
    if grade >= 90:
        status = "ممتاز"
    elif grade >= 80:
        status = "جيد جداً"
    elif grade >= 70:
        status = "جيد"
    else:
        status = "مقبول"
    
    print(f"الطالب: {name:12} | الدرجة: {grade} | التقدير: {status}")

# حساب المعدل
total = sum(student_grades.values())
average = total / len(student_grades)
print("=" * 35)
print(f"المعدل العام: {average:.2f}")
النتيجة
تقرير درجات الطلاب =================================== الطالب: Ahmed | الدرجة: 85 | التقدير: جيد جداً الطالب: Sara | الدرجة: 92 | التقدير: ممتاز الطالب: Mohammed | الدرجة: 78 | التقدير: جيد الطالب: Fatima | الدرجة: 95 | التقدير: ممتاز الطالب: Omar | الدرجة: 88 | التقدير: جيد جداً =================================== المعدل العام: 87.60

5. الحلقات المتداخلة (Nested Loops)

يمكن وضع حلقة for داخل حلقة for أخرى. هذا ما يسمى بالحلقات المتداخلة، وهي ضرورية للتعامل مع البيانات ثنائية الأبعاد مثل المصفوفات والجداول.

كيف تعمل: لكل دورة واحدة من الحلقة الخارجية، تنفذ الحلقة الداخلية كاملة. إذا كانت الحلقة الخارجية تتكرر 3 مرات والداخلية 4 مرات، فإن الكود الداخلي سينفذ 12 مرة (3 × 4).

multiplication_table.py
# إنشاء جدول الضرب
print("جدول الضرب (1-5)")
print("=" * 40)

for i in range(1, 6):
    print(f"\nجدول ضرب العدد {i}:")
    for j in range(1, 11):
        result = i * j
        print(f"  {i} x {j} = {result}")

# مثال آخر: طباعة نمط هرمي
print("\n" + "=" * 40)
print("نمط هرمي:")

rows = 5
for i in range(1, rows + 1):
    spaces = " " * (rows - i)
    stars = "*" * (2 * i - 1)
    print(spaces + stars)
النتيجة (مختصرة)
جدول الضرب (1-5) ======================================== جدول ضرب العدد 1: 1 x 1 = 1 1 x 2 = 2 ... ======================================== نمط هرمي: * *** ***** ******* *********
تحذير بخصوص الأداء: الحلقات المتداخلة قد تكون بطيئة جداً مع البيانات الكبيرة. إذا كانت كل حلقة تتكرر 1000 مرة، فإن الكود سينفذ مليون مرة. استخدمها بحذر.

6. استخدام enumerate و zip

توفر بايثون دوال مساعدة تجعل التكرار أكثر قوة ومرونة. دالة enumerate() تعطيك الفهرس مع القيمة، ودالة zip() تسمح بالتكرار على عدة قوائم بالتوازي.

enumerate_zip.py
# استخدام enumerate للحصول على الفهرس
products = ["Laptop", "Phone", "Tablet", "Watch"]

print("قائمة المنتجات:")
for index, product in enumerate(products, start=1):
    print(f"{index}. {product}")

# استخدام zip للتكرار على قائمتين
names = ["Ahmed", "Sara", "Omar"]
scores = [85, 92, 78]
cities = ["Cairo", "Riyadh", "Dubai"]

print("\nبيانات الطلاب:")
print("-" * 40)
for name, score, city in zip(names, scores, cities):
    print(f"الاسم: {name:8} | الدرجة: {score} | المدينة: {city}")
النتيجة
قائمة المنتجات: 1. Laptop 2. Phone 3. Tablet 4. Watch بيانات الطلاب: ---------------------------------------- الاسم: Ahmed | الدرجة: 85 | المدينة: Cairo الاسم: Sara | الدرجة: 92 | المدينة: Riyadh الاسم: Omar | الدرجة: 78 | المدينة: Dubai

7. تطبيق عملي شامل: نظام إدارة المخزون

لنجمع كل ما تعلمناه في تطبيق عملي يحاكي نظام إدارة مخزون بسيط.

inventory_system.py
# نظام إدارة المخزون
inventory = {
    "Laptop": {"price": 999, "quantity": 15},
    "Phone": {"price": 599, "quantity": 30},
    "Tablet": {"price": 399, "quantity": 25},
    "Headphones": {"price": 149, "quantity": 50},
    "Charger": {"price": 29, "quantity": 100}
}

print("=" * 55)
print("           تقرير المخزون الشامل")
print("=" * 55)

total_value = 0
low_stock_items = []

for product, details in inventory.items():
    price = details["price"]
    quantity = details["quantity"]
    value = price * quantity
    total_value += value
    
    if quantity < 20:
        low_stock_items.append(product)
        status = "[تحذير: مخزون منخفض]"
    else:
        status = "[متوفر]"
    
    print(f"المنتج: {product:12} | السعر: ${price:5} | الكمية: {quantity:3} | القيمة: ${value:6} {status}")

print("=" * 55)
print(f"القيمة الإجمالية للمخزون: ${total_value:,}")

if low_stock_items:
    print(f"\nتنبيه: المنتجات التالية تحتاج إعادة تموين:")
    for item in low_stock_items:
        print(f"  - {item}")

8. أفضل الممارسات والنصائح

افعل
  • استخدم أسماء متغيرات معبرة (for student in students)
  • استخدم enumerate() عند الحاجة للفهرس
  • استخدم zip() للتكرار على قوائم متعددة
  • أضف تعليقات للحلقات المعقدة
لا تفعل
  • لا تستخدم أسماء مبهمة (for x in y)
  • لا تعدل القائمة أثناء التكرار عليها
  • تجنب الحلقات المتداخلة العميقة (أكثر من 3)
  • لا تستخدم range(len(list)) بدون داع
ملخص الدرس
  • حلقة for تستخدم للتكرار على العناصر القابلة للتكرار
  • دالة range() تولد تسلسلات أرقام بثلاثة أشكال مختلفة
  • يمكن التكرار على القوائم والنصوص والقواميس وغيرها
  • الحلقات المتداخلة مفيدة للبيانات ثنائية الأبعاد
  • enumerate() و zip() أدوات قوية لتحسين الكود

السؤال التالي: ماذا لو أردنا التكرار طالما شرط معين متحقق وليس لعدد محدد؟

الخطوة التالية

تعلمت التكرار المحدد. الآن حان وقت تعلم التكرار الشرطي مع حلقة while.

الدرس التالي: حلقة while (التكرار الشرطي)
المحرر الذكي

اكتب الكود وشاهد النتيجة فوراً

جرب الآن مجاناً
قناة ديف عربي

تابع أحدث الدروس والتحديثات مباشرة على واتساب

انضم الآن