تكرار السؤال: …
الإجابة المختصرة
هي صيغة مختصرة لبناء collection جديدة من iterable مع تحويل أو تصفية بسيطة، وتصبح عبئًا عندما تتداخل الحلقات أو تكثر الشروط أو تحتوي آثارًا جانبية.
الشرح
الـ comprehension أوضح وأسرع قليلًا من حلقة append عندما يكون التحويل بسيطًا. لكل comprehension نطاق خاص بها فلا يتسرب متغير الحلقة للخارج. إذا احتجت أكثر من شرط أو حلقتين متداخلتين، فالحلقة العادية أو دالة مسماة أوضح. وإذا كنت ستمرر النتيجة مباشرة لدالة مثل sum أو any، فاستخدم generator expression لتجنب بناء قائمة كاملة في الذاكرة.
مثال بالكود
squares = {n: n * n for n in range(10) if n % 2 == 0}
active_emails = [u.email for u in users if u.is_active]
# generator expression بدون قائمة وسيطة
total = sum(item.price for item in cart)أخطاء شائعة
- استخدام comprehension لتنفيذ آثار جانبية فقط مثل [print(x) for x in items].
- كتابة comprehension بثلاث حلقات وشروط متعددة في سطر واحد يصعب قراءته ومراجعته.