التكرار على القوائم في بايثون
القوائم تصبح أقوى بكثير عندما نتعلم كيف نمر على عناصرها ونعالجها واحداً تلو الآخر. التكرار على القوائم هو أحد أكثر العمليات شيوعاً في البرمجة، ويستخدم في كل شيء من معالجة البيانات إلى بناء واجهات المستخدم.
في هذا الدرس، ستتعلم جميع طرق التكرار على القوائم في بايثون: من الطريقة البسيطة إلى التقنيات المتقدمة مثل enumerate و zip و List Comprehension.
1. التكرار البسيط باستخدام for
أبسط طريقة للمرور على عناصر القائمة هي استخدام حلقة for. في كل دورة، يتم تعيين العنصر الحالي لمتغير الحلقة.
fruits = ["Apple", "Banana", "Cherry", "Date"]
print("=== التكرار البسيط ===")
for fruit in fruits:
print(f" - {fruit}")
# مثال مع معالجة
print("\n=== مع معالجة ===")
numbers = [1, 2, 3, 4, 5]
total = 0
for num in numbers:
total += num
print(f"أضفت {num}, المجموع الآن: {total}")
print(f"\nالمجموع النهائي: {total}")
2. التكرار مع الفهرس باستخدام enumerate
أحياناً تحتاج لمعرفة موضع العنصر (فهرسه) أثناء التكرار. الدالة enumerate() توفر الفهرس والقيمة معاً.
students = ["أحمد", "سارة", "محمد", "فاطمة"]
print("=== قائمة الطلاب (تبدأ من 0) ===")
for index, student in enumerate(students):
print(f" [{index}] {student}")
print("\n=== قائمة الطلاب (تبدأ من 1) ===")
for index, student in enumerate(students, start=1):
print(f" {index}. {student}")
# استخدام عملي: البحث عن موضع عنصر
print("\n=== البحث عن 'محمد' ===")
for i, name in enumerate(students):
if name == "محمد":
print(f"تم العثور على 'محمد' في الموضع {i}")
3. التكرار على قائمتين معاً باستخدام zip
الدالة zip() تسمح بالتكرار على قائمتين أو أكثر في نفس الوقت، بحيث تحصل على عنصر من كل قائمة في كل دورة.
names = ["أحمد", "سارة", "محمد"]
ages = [25, 30, 28]
cities = ["القاهرة", "الرياض", "دبي"]
print("=== بيانات الأشخاص ===")
for name, age, city in zip(names, ages, cities):
print(f" {name} ({age} سنة) - {city}")
# استخدام عملي: إنشاء قاموس من قائمتين
print("\n=== إنشاء قاموس ===")
keys = ["name", "age", "city"]
values = ["أحمد", 25, "القاهرة"]
person = dict(zip(keys, values))
print(f" {person}")
4. List Comprehension
List Comprehension هي طريقة أنيقة ومختصرة لإنشاء قوائم جديدة من قوائم موجودة. تجمع بين التكرار والشرط في سطر واحد.
# الطريقة التقليدية
squares_traditional = []
for x in range(1, 6):
squares_traditional.append(x ** 2)
# باستخدام List Comprehension
squares = [x ** 2 for x in range(1, 6)]
print(f"المربعات: {squares}")
# مع شرط (فلترة)
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
evens = [n for n in numbers if n % 2 == 0]
print(f"الزوجية فقط: {evens}")
# مع تحويل وشرط
words = ["hello", "world", "python", "is", "awesome"]
long_upper = [w.upper() for w in words if len(w) > 4]
print(f"الكلمات الطويلة بالحروف الكبيرة: {long_upper}")
5. تطبيق عملي: تحليل البيانات
grades = [85, 92, 78, 95, 88, 76, 90, 82, 97, 73]
print("=== تحليل درجات الطلاب ===")
print(f"الدرجات: {grades}")
print("-" * 40)
# الإحصائيات
print(f"عدد الطلاب: {len(grades)}")
print(f"المجموع: {sum(grades)}")
print(f"المتوسط: {sum(grades) / len(grades):.2f}")
print(f"الأعلى: {max(grades)}")
print(f"الأدنى: {min(grades)}")
# الطلاب الناجحين (60 فأعلى)
passing = [g for g in grades if g >= 60]
print(f"\nالناجحون: {len(passing)} من {len(grades)}")
# الطلاب المتفوقين (90 فأعلى)
excellent = [g for g in grades if g >= 90]
print(f"المتفوقون: {len(excellent)}")
6. أفضل الممارسات
- استخدم enumerate بدلاً من range(len())
- استخدم zip لتكرار متوازي
- استخدم List Comprehension للتحويلات البسيطة
- اختر أسماء معبرة لمتغيرات الحلقة
- لا تعدل القائمة أثناء التكرار عليها
- لا تفرط في تعقيد List Comprehension
- لا تستخدم range(len(list)) بشكل عام
- لا تنس أن zip تتوقف عند أقصر قائمة
ملخص الدرس
for item in listللتكرار البسيطenumerate()للحصول على الفهرس والقيمةzip()للتكرار على عدة قوائم معاً- List Comprehension لإنشاء قوائم بشكل مختصر