الاستيعابات (القوائم والمجموعات والقواميس)
الاستيعاب (comprehension) صياغة موجزة لبناء قائمة أو مجموعة أو قاموس من مصدر
قابل للتكرار، بجملة واحدة بدل حلقة صريحة. تتبع لغة ص الترتيب العربيّ الطبيعيّ:
رأس الحلقة أوّلًا، ثمّ الكلمة أنتج تفصله عن تعبير الناتج.
الصيغ الثلاث
قائمة: [ لكل <متغيّر> في <مصدر> أنتج <ناتج> ] مجموعة: { لكل <متغيّر> في <مصدر> أنتج <ناتج> } قاموس: { لكل <متغيّر> في <مصدر> أنتج <مفتاح>: <قيمة> }
- الأقواس
[ ]أو المعقوفة{ }تحيط بالاستيعاب كلّه.- الجزء «
إذا <شرط>» — قبلأنتج— اختياريّ في الأنواع الثلاثة؛ يرشّح العناصر قبل الإنتاج.- الكلمة
أنتجتفصل رأس الحلقة عن الناتج. وهي كلمة سياقيّة (تُستعمَل أيضًا للتوليد في المولّدات).
لماذا هذا الترتيب؟ العربيّة تُقدّم السبب ثمّ الجواب: «لكلّ عنصرٍ في القائمة …
أنتِج كذا». فالقارئ يعرف ما الذي نمرّ عليه قبل ما الذي نبنيه — على خلاف الترتيب
البايثونيّ الذي يضع الناتج أوّلًا. (سابقة مماثلة: from … where … select في C# LINQ
حيث المصدر أوّلًا.)
استيعاب القائمة
يبني قائمةً بتطبيق تعبير الناتج على كلّ عنصر (بعد الترشيح إن وُجد شرط).
متغير المضاعفات = [لكل س في [1، 2، 3، 4] أنتج س * 2]
اطبع_سطر(المضاعفات)
[2, 4, 6, 8]
مع شرط ترشيح قبل أنتج:
متغير الكبار = [لكل س في [1، 2، 3، 4، 5] إذا س > 2 أنتج س]
اطبع_سطر(الكبار)
[3, 4, 5]
استيعاب المجموعة
يبني مجموعة (عناصر فريدة، بلا تكرار) داخل { } بلا نقطتين بعد الناتج.
تُزال التكرارات على قيمة الناتج، مع الحفاظ على ترتيب أوّل ظهور.
متغير الفريدة = {لكل س في [1، 2، 2، 3] أنتج س}
اطبع_سطر(الفريدة)
[1, 2, 3]
بما أنّ إزالة التكرار تكون على الناتج لا على المصدر، فإنّ تحويلًا يطوي مدخلاتٍ متمايزةً يُصغّر المجموعة:
متغير البواقي = {لكل س في [1، 2، 3، 4] أنتج س % 3}
اطبع_سطر(طول(البواقي))
3
المصدر
[1، 2، 3، 4]متمايز (٤ عناصر)، لكنّس % 3يُنتج[1، 2، 0، 1]فتُطوى1المكرّرة ⇒ المجموعة[1، 2، 0]بطول ٣.
استيعاب القاموس
يبني قاموسًا داخل { } عندما يكون الناتج على هيئة مفتاح: قيمة (وجود : بعد
الناتج هو ما يميّز القاموس عن المجموعة).
متغير المربّعات = {لكل س في [1، 2، 3] أنتج نص(س): س * س}
اطبع_سطر(المربّعات)
{"1": 1, "2": 4, "3": 9}
- متغيّر الحلقة مفرد (لا يُفكّك زوجًا) ما دام المصدر مصفوفةً؛ أمّا حين يكون المصدر خريطةً فانظر فكّ الزوج أدناه.
- عند تصادُم مفتاحين، يفوز الأخير (كالخريطة الحرفيّة).
- الشرط
إذا— إن وُجد — يسبقأنتجكالمعتاد:
متغير الزوجيّة = {لكل س في [1، 2، 3، 4] إذا س % 2 == 0 أنتج نص(س): س * 10}
اطبع_سطر(الزوجيّة)
{"2": 20, "4": 40}
فكّ الزوج: التكرار على الخرائط
🚧 القناة القادمة: هذه الميزة متوفّرة في القناة القادمة (
/next/)؛ ستنتقل إلى المستقرّ مع الإصدار التالي.
يمكن أن يكون المصدر خريطةً لا مصفوفةً. عندئذٍ يمرّ الاستيعاب على مدخلات الخريطة. وله شكلان — بمتغيّر واحد (المفتاح فقط) أو بمتغيّرين (فكّ الزوج):
متغيّر واحد: [ لكل <مفتاح> في <خريطة> أنتج <ناتج> ]
متغيّران: [ لكل <مفتاح>، <قيمة> في <خريطة> أنتج <ناتج> ]
بمتغيّر واحد يُربَط الاسم بكلّ مفتاح (لا القيمة):
متغير المفاتيح = [لكل مفتاح في {"أ": 1} أنتج مفتاح]
اطبع_سطر(المفاتيح)
[أ]
المصفوفات تطبع عناصرها النصّيّة بلا علامتَي اقتباس (
[أ])، بخلاف مفاتيح الخريطة المقتبسة ({"أ": …}).
الفاصلة ، تُدخِل متغيّر القيمة (فكّ الزوج): يُربَط الأوّل بالمفتاح والثاني
بالقيمة — على منوال حلقة لكل حين تمرّ على خريطة:
متغير القيم = [لكل مفتاح، قيمة في {"س": 5} أنتج قيمة]
اطبع_سطر(القيم)
[5]
ويعمل فكّ الزوج في الأنواع الثلاثة. مثال يعيد بناء قاموس بقِيَم مضاعفة:
متغير المضاعف = {لكل مفتاح، قيمة في {"أ": 3} أنتج مفتاح: قيمة * 2}
اطبع_سطر(المضاعف["أ"])
6
والشرط إذا — إن وُجد — يستطيع الإشارة إلى متغيّر القيمة:
متغير الكبيرة = [لكل مفتاح، قيمة في {"أ": 2، "ب": 5} إذا قيمة > 3 أنتج قيمة]
اطبع_سطر(طول(الكبيرة))
1
ترتيب المدخلات غير محدَّد. كحلقة
لكلعلى الخرائط، لا تضمن اللغة ترتيب المرور على المدخلات. لنتيجةٍ حتميّة استعمل خريطةً بمفتاحٍ واحد، أو عمليّةً لا تعتمد على الترتيب (كالجمع أوطول)، أو رتّب النتيجة صراحةً.
قاموس أم مجموعة؟ قاعدة التمييز
كلاهما داخل { }؛ الفارق وجود : بعد الناتج:
| الصياغة | النوع |
|---|---|
{لكل س في مصدر أنتج ناتج} | مجموعة (ناتج مفرد) |
{لكل س في مصدر أنتج مفتاح: قيمة} | قاموس |
أخطاء شائعة
- الترتيب القديم مرفوض:
[س * 2 لكل س في القائمة](الناتج قبللكل) لم يعد صالحًا؛ استعمل[لكل س في القائمة أنتج س * 2]. - نسيان
أنتج:[لكل س في القائمة]خطأ نحويّ؛ رأس الحلقة يتطلّبأنتج <ناتج>. - موضع الشرط:
إذايسبقأنتجدائمًا:[لكل س في م إذا شرط أنتج ناتج]. - فاصلة فكّ الزوج بلا اسم:
[لكل م، في خريطة أنتج م]خطأ نحويّ؛ الفاصلة تتطلّب اسم متغيّر القيمة بعدها:[لكل م، ق في خريطة أنتج م].
انظر أيضًا
- التحكّم بالتدفّق — الحلقة
لكل ... في. - المولّدات و
أنتج— الاستعمال الآخر لكلمةأنتج. - قواعد النحو (Grammar) — نظرة عامّة على النحو الرسميّ.
التعريف الكامل على مستوى القاعدة (
gr.adv.list_comprehension،gr.adv.dict_comprehensionوما يقابلهما للمجموعة) مُولَّد فيdocs/parser_rule/_generatedبالمستودع الأساسيّ. - الكلمات المحجوزة الأربعون — تمييز المحجوز عن السياقيّ.