2.30. الإدراكات

الإدراك يبني قائمة أو مجموعة أو قاموسًا أو مولّدًا جديدًا من تكراري موجود، في تعبير واحد. وهو بديل للنمط الشائع المتمثل في البدء بحاوية فارغة والإلحاق بها داخل حلقة.

2.30.1. إدراكات القوائم

squares = [x * x for x in range(5)]
print(squares)

المخرجات:

[0, 1, 4, 9, 16]

الحلقة نفسها مكتوبة بالكامل:

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

صيغة الإدراك هي تعبير واحد يبني القائمة في مكانها. لا يوجد squares = [] ولا .append -- فالنتيجة هي قيمة الإدراك.

The expression "[f(x) for x in xs if cond]" annotated: the leading expression is the result, the for clause names the loop variable, the if clause filters which items are kept.

يُنتِج التعبير المتقدم كل عنصر؛ وتسمّي عبارة for متغير الحلقة؛ وتصفّي عبارة if الاختيارية العناصر للتخلص منها.

2.30.2. التصفية باستخدام if

تحتفظ عبارة if الاختيارية فقط بالعناصر المطابقة:

evens = [x for x in range(10) if x % 2 == 0]
print(evens)

المخرجات:

[0, 2, 4, 6, 8]

تُنفَّذ التصفية قبل التعبير المتقدم -- يُفحص x % 2 == 0 أولًا؛ ولا تصل إلى x للمخرجات إلا القيم المطابقة.

2.30.3. إدراكات القواميس والمجموعات

ينطبق الشكل نفسه على القيم الحرفية للقواميس والمجموعات.

يحتوي إدراك القاموس على زوج key: value قبل for:

squares = {x: x * x for x in range(5)}
print(squares)

المخرجات:

{0: 0, 1: 1, 2: 4, 3: 9, 4: 16}

يستخدم إدراك المجموعة أقواسًا معقوفة وتعبيرًا واحدًا:

unique_lengths = {len(w) for w in ["a", "bb", "c", "bb"]}
print(unique_lengths)

المخرجات:

{1, 2}

2.30.4. تعبيرات المولّدات

تنتج الأقواس الدائرية تعبير مولّد بدلًا من قائمة. تُحسب القيم واحدة تلو الأخرى عند الطلب:

total = sum(x * x for x in range(1000))

لا تُبنى أبدًا قائمة من مليون عنصر. تتدفق القيم واحدة تلو الأخرى إلى sum()، التي تجمعها وتتخلص من كل قيمة أثناء تقدمها.

تعبيرات المولّدات هي الخيار الصحيح عند تمرير القيم إلى دالة اختزال (sum() وmax() وany() وall()) أو أي كود آخر يستهلك مكرِّرًا -- فهي توفّر الذاكرة التي كانت القائمة المكافئة ستستهلكها.

2.30.5. متى لا تستخدم الإدراك

الإدراكات موجزة لكنها ليست دائمًا أوضح. الجأ إلى حلقة for عادية عندما:

  • يحتاج المتن إلى أكثر من عبارة واحدة (الإدراك يتسع لتعبير واحد بالضبط).

  • يكون للمتن آثار جانبية (الطباعة، أو الكتابة إلى ملف) -- فالإدراكات مخصصة لـ بناء مجموعة، لا لتنفيذ إجراءات.

  • يكون للتصفية أو التحويل أجزاء كثيرة بحيث لم يعد الإدراك يُقرأ من اليسار إلى اليمين.