حلقة التكرار for (For Loop)
تخيل أنك مدير مصنع تحتاج لفحص جودة 1000 منتج. هل ستكتب أمر الفحص ألف مرة؟ بالطبع لا. في عالم البرمجة، نواجه باستمرار مهام تتطلب تكرار نفس العملية على مجموعة من العناصر: إرسال رسائل لقائمة من المستخدمين، حساب مجموع أرقام، معالجة ملفات متعددة، أو عرض بيانات من قاعدة بيانات. هنا تأتي قوة حلقات التكرار.
حلقة for في بايثون هي الأداة الأساسية والأكثر استخداماً للتكرار. تتميز بايثون بأسلوب تكرار أنيق وقريب من اللغة الطبيعية، حيث نقول حرفياً: "لكل عنصر في هذه المجموعة، افعل كذا". هذا الأسلوب يجعل الكود أقصر وأوضح وأقل عرضة للأخطاء مقارنة بلغات البرمجة الأخرى.
في هذا الدرس المفصل، ستتعلم كل ما تحتاجه عن حلقة for: من المفاهيم الأساسية إلى التقنيات المتقدمة، مع أمثلة عملية متنوعة تغطي سيناريوهات واقعية.
1. مفهوم التكرار (Iteration) في البرمجة
التكرار هو أحد المفاهيم الأساسية في البرمجة. يعني ببساطة تنفيذ مجموعة من الأوامر عدة مرات. بدون التكرار، ستضطر لكتابة نفس الكود مراراً، مما يجعل البرنامج طويلاً وصعب الصيانة ومعرضاً للأخطاء.
في بايثون، حلقة for مصممة خصيصاً لما يسمى "التكرار المحدد" (Definite Iteration)، أي التكرار لعدد معروف مسبقاً من المرات أو على عناصر مجموعة محددة. هذا يختلف عن حلقة while التي سنتعلمها لاحقاً والتي تستخدم للتكرار غير المحدد.
لماذا نحتاج التكرار؟
- تقليل حجم الكود: بدلاً من كتابة 100 سطر، تكتب 3 أسطر فقط
- سهولة الصيانة: التعديل في مكان واحد ينعكس على كل التكرارات
- تقليل الأخطاء: نسخ ولصق الكود يؤدي لأخطاء، التكرار يتجنب ذلك
- المرونة: يمكن تغيير عدد التكرارات بسهولة دون تعديل الكود
- معالجة البيانات الديناميكية: التعامل مع بيانات متغيرة الحجم
2. الصيغة الأساسية لحلقة for
تتكون حلقة for من عدة أجزاء: الكلمة المفتاحية for، متغير التكرار، الكلمة المفتاحية in، الكائن القابل للتكرار (Iterable)، ثم نقطتان رأسيتان. الكود المراد تكراره يكتب في السطور التالية مع إزاحة للداخل.
# الصيغة العامة:
# for variable in iterable:
# code_block
# مثال أساسي: التكرار على قائمة
fruits = ["Apple", "Banana", "Cherry", "Date", "Elderberry"]
print("قائمة الفواكه المتاحة:")
print("-" * 30)
for fruit in fruits:
print("- " + fruit)
print("-" * 30)
print("انتهى عرض القائمة")
تحليل الكود خطوة بخطوة
- تعريف القائمة: أنشأنا قائمة
fruitsتحتوي على 5 عناصر - بداية الحلقة:
for fruit in fruitsتبدأ التكرار - الدورة الأولى: المتغير
fruitيأخذ القيمة "Apple" - تنفيذ الكود: يتم طباعة "- Apple"
- الدورة الثانية: المتغير
fruitيأخذ القيمة "Banana" - وهكذا... حتى تنتهي جميع العناصر
- الخروج من الحلقة: بعد آخر عنصر، ينتقل التنفيذ للكود التالي
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(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}")
range() لا تخزن كل الأرقام في الذاكرة مرة واحدة، بل تولدها عند الحاجة. هذا يجعلها فعالة جداً حتى مع الأرقام الكبيرة مثل range(1000000).
4. التكرار على أنواع البيانات المختلفة
من أقوى ميزات حلقة for في بايثون قدرتها على التكرار على أي كائن قابل للتكرار (Iterable). هذا يشمل القوائم، النصوص، المجموعات، القواميس، وحتى الملفات.
التكرار على النصوص (Strings)
النص في بايثون هو سلسلة من الأحرف، ويمكن التكرار على كل حرف فيه بشكل منفصل. هذا مفيد جداً لمعالجة النصوص وتحليلها.
# التكرار على أحرف كلمة
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}")
التكرار على القواميس (Dictionaries)
القواميس تحتوي على أزواج من المفاتيح والقيم. يمكن التكرار على المفاتيح فقط، القيم فقط، أو كليهما معاً.
# قاموس يحتوي على درجات الطلاب
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}")
5. الحلقات المتداخلة (Nested Loops)
يمكن وضع حلقة for داخل حلقة for أخرى. هذا ما يسمى بالحلقات المتداخلة، وهي ضرورية للتعامل مع البيانات ثنائية الأبعاد مثل المصفوفات والجداول.
كيف تعمل: لكل دورة واحدة من الحلقة الخارجية، تنفذ الحلقة الداخلية كاملة. إذا كانت الحلقة الخارجية تتكرر 3 مرات والداخلية 4 مرات، فإن الكود الداخلي سينفذ 12 مرة (3 × 4).
# إنشاء جدول الضرب
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)
6. استخدام enumerate و zip
توفر بايثون دوال مساعدة تجعل التكرار أكثر قوة ومرونة. دالة enumerate() تعطيك الفهرس مع القيمة، ودالة zip() تسمح بالتكرار على عدة قوائم بالتوازي.
# استخدام 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}")
7. تطبيق عملي شامل: نظام إدارة المخزون
لنجمع كل ما تعلمناه في تطبيق عملي يحاكي نظام إدارة مخزون بسيط.
# نظام إدارة المخزون
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 (التكرار الشرطي)