ما هي الـ 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).