تخطَّ إلى المحتوى

🐍 شرح Python

الفهم الشامل (Comprehensions)

الدرس 27 من 30· ⏱ 3 دقائق قراءة

ما هي الـ Comprehension؟

صياغة مختصرة لبناء قائمة أو قاموس أو مجموعة جديدة من عنصر قابل للتكرار، بسطر واحد بدل حلقة for كاملة مع append.

فهم القوائم (List Comprehension)

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

[تعبير for عنصر in متسلسلة]
squares = [x ** 2 for x in range(10)]
print(squares)   # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

الطريقة التقليدية المكافئة لها تمامًا:

squares = []
for x in range(10):
    squares.append(x ** 2)

إضافة شرط (if)

evens = [x for x in range(20) if x % 2 == 0]
print(evens)   # [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

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

ترتيب for وif هنا نفس ترتيبها في الحلقات المتداخلة العادية:

pairs = [(x, y) for x in [1, 2, 3] for y in [3, 1, 4] if x != y]
print(pairs)   # [(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]

⚠️ لبناء صفوف (tuples) داخل comprehension يجب وضعها بين قوسين، وإلا فسّرها بايثون كخطأ صياغي: [(x, x**2) for x in range(6)] صحيحة، بينما [x, x**2 for x in range(6)] تُطلق SyntaxError.

فهم القواميس (Dict Comprehension)

نفس الفكرة، لكن بأقواس معقوفة { } وزوج مفتاح: قيمة:

squares_dict = {x: x ** 2 for x in range(5)}
print(squares_dict)   # {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}

مثال عملي: تحويل قائمتين متوازيتين لقاموس مع شرط تصفية:

names = ["أحمد", "سارة", "خالد"]
scores = [55, 92, 78]

passing = {n: s for n, s in zip(names, scores) if s >= 60}
print(passing)   # {'سارة': 92, 'خالد': 78}

فهم المجموعات (Set Comprehension)

بنفس أقواس { } لكن بدون : — والفرق الجوهري أن المجموعة الناتجة تحذف التكرار تلقائيًا:

word = "abracadabra"
unique_letters = {ch for ch in word if ch not in "abc"}
print(unique_letters)   # {'r', 'd'}

تعبير المولّد (Generator Expression) — لمحة سريعة

نفس صياغة list comprehension لكن بأقواس عادية ( ). الفرق أنها لا تبني القائمة كاملة في الذاكرة، بل تولّد كل قيمة عند الحاجة فقط:

total = sum(x ** 2 for x in range(1_000_000))   # لا يبني مليون عنصر بالذاكرة

سنتعمّق في هذه الفكرة (والمولّدات عمومًا) في الدرس القادم.

متى تتجنّب الـ Comprehension؟

  • عندما يصبح السطر طويلًا ومتداخلًا لدرجة يصعب قراءتها — حلقة for عادية أوضح حينها.
  • عندما يحتاج كل تكرار لأكثر من عملية منطقية معقّدة — استخرجها لدالة منفصلة واستدعِها داخل الـ comprehension.

جرّب بنفسك

🐍 محرّر بايثون
📥 المدخلات (input) — قيمة في كل سطر
وحدة التحكّم
اضغط «تشغيل» لرؤية النتيجة هنا.

أخطاء شائعة

  • نسيان الأقواس حول tuple داخل list comprehension → SyntaxError.
  • الخلط بين {} للقواميس (تحتاج :) و{} للمجموعات (بدون :).
  • المبالغة في تداخل عدة for/if بسطر واحد لدرجة تفقد الوضوح.

🎯 التالي: المولّدات والتكرارات (Generators & Iterators).

شرح الفهم الشامل (Comprehensions) — Python بالعربي
الفهم الشامل (Comprehensions)Python بالعربي · The Code Fix

📚 لمزيد من التعمّق في Python، راجِع التوثيق الرسمي لـ Python.

هل كان هذا الدرس مفيدًا؟