محتويات الدورة

بايثون / برامج موثوقة / الدرس 10

الاستيعابات وخطوط التكرار

عبّر عن التحويلات بإيجاز مع توضيح ترتيب التقييم والاستهلاك لمرة واحدة وسلوك الذاكرة.

وقت القراءة التقريبي: 4 دقيقةتاريخ مراجعة المحتوى
في هذه الصفحة

أهداف الدرس

  • قراءة الاستيعاب كحلقة
  • التحقق من افتراضات خط المعالجة

قراءة الاستيعاب كحلقة

يبني استيعاب القائمة قائمة جديدة من قابل للتكرار مع تصفية اختيارية. اقرأ [expression for item in source if condition] كزيارة عنصر وفحص شرط وإضافة تعبير للمقبول. يناسب تحويلا قصيرا دون آثار جانبية غير مرتبطة. تتبع جمل for المتداخلة ترتيبها من اليسار لليمين مثل الحلقات، وقد تضاعف الزيارات. إذا احتاج الفهم إلى فروع كثيرة أو معالجة استثناء داخلية فالحلقة العادية أوضح. تستحق الصياغة الموجزة مكانها عندما تكشف القصد.

دور القابل للتكرار ودور المكرّر

يوفر القابل للتكرار مكررا عبر iter. يحفظ المكرر التقدم ويعطي القيمة التالية بواسطة next، ثم يرفع StopIteration عند الانتهاء. تستطيع القائمة إنشاء مكرر جديد كل مرة، بينما يستهلك المكرر عادة مرة واحدة. يشترك مستهلكان للمكرر نفسه في التقدم. تتيح قائمة محفوظة تكرار المرور لكنها تكلف ذاكرة ولا تناسب مصدرا لا نهائيا. وضح هل تستهلك الدالة المدخل مرة واحدة أم تتطلب مجموعة قابلة لإعادة المرور، حتى لا تختفي بيانات على المستدعي بصورة خفية.

التحويل والتصفية عن قصد

يحسب المثال مربعات المدخلات الزوجية فقط. يفحص الشرط قبل تعبير الناتج لكل مدخل، فلا تضيف العناصر المرفوضة نتائج. تشبه استيعابات القاموس والمجموعة الصياغة مع اختلاف المعنى: تستبدل مفاتيح القاموس المتكررة قيما سابقة، وتزيل المجموعة التكرار. ليست خيارات شكلية. إذا كان تكرار المفتاح تلفا، فلا يصلح استيعاب يسكت ويحتفظ بالأخير؛ استخدم حلقة تكشف التكرار وتبلغ عنه. وضح دائما سلوك المدخل الفارغ والقيم المكررة.

python التحويل والتصفية عن قصد — مثال محلول
values = [1, 2, 3, 4, 5]
even_squares = [value * value for value in values if value % 2 == 0]
print(even_squares)
print({value: value * value for value in [2, 3]})
الناتج المتوقع
[4, 16]
{2: 4, 3: 9}

يمر اثنان وأربعة فقط من الشرط. يربط القاموس كل مدخل بمربعه ويحفظ ترتيب الإدراج.

الاستهلاك الكسول بأجزاء محدودة

تحسب تعبيرات المولد القيم عند الطلب بدلا من بناء قائمة كاملة. تأخذ itertools.islice بادئة محدودة، وتستهلك sum التدفق تدريجيا. يقلل الكسل البيانات الوسيطة المحتفظ بها، لكنه لا يقلل العمل الإجمالي تلقائيا ولا يجعل العملية غير متزامنة. وقد يظهر الخطأ عند الاستهلاك بدلا من الإنشاء. يوضح المثال التقدم لمرة واحدة: يأخذ الجزء الأول عنصرين ثم لا يرى المستهلك الثاني إلا الباقي. اجعل ملكية المكرر جزءا من العقد، خصوصا مع عدة مراحل.

python الاستهلاك الكسول بأجزاء محدودة — مثال محلول
from itertools import islice

source = iter([10, 20, 30, 40])
print(list(islice(source, 2)))
print(list(source))
print(list(source))
الناتج المتوقع
[10, 20]
[30, 40]
[]

يقدم المستهلك الأول المكرر عنصرين، ويستنفد التالي الباقي. يؤكد المرور الأخير نفاده ولا يبدأ القائمة الأصلية من جديد.

التحقق من افتراضات خط المعالجة

تتركب أدوات التكرار عندما تتوافق عقودها. تتوقف zip افتراضيا عند أقصر مدخل؛ وترفض zip(..., strict=True) الأطوال المختلفة إذا تطلب العقد تساويها، وهي متاحة في إصدارات المقرر. توفر enumerate عدادا دون بحث فهرسي متكرر. يستهلك sorted المدخل كله ويعيد قائمة، فيزيل ميزة التدفق إذا وضع وسط الخط. راجع هل تستهلك كل مرحلة البيانات أو تخزنها أو ترتبها أو تكررها. اختبر مكررا أحادي المرور بجانب القائمة، لأن المرور مرتين قد يبدو صحيحا مع القوائم ويفشل مع التدفقات.

الأخطاء الشائعة وإصلاحها

غياب البيانات في المرور الثاني

لماذا يحدث؟
المدخل مكرر مستنفد لا مجموعة قابلة لإعادة المرور.
كيف تصلحه؟
استهلك مرة أو احفظ قائمة ضمن حد حجم موثق.
كيف تتجنب تكراره؟
اختبر الدوال بمكرر مشتق من القائمة أيضا.

إسقاط zip قيما دون تنبيه

لماذا يحدث؟
تتوقف zip الافتراضية عند أقصر قابل للتكرار.
كيف تصلحه؟
استخدم strict=True إذا خالف اختلاف الطول العقد.
كيف تتجنب تكراره؟
ضم حالات اختلاف الأطوال إلى التحقق.

استخدام التدفق ذاكرة كبيرة فجأة

لماذا يحدث؟
تحتفظ قائمة وسيطة أو عملية ترتيب بكل القيم.
كيف تصلحه؟
أزل الحفظ غير الضروري أو حدد دفعات محدودة.
كيف تتجنب تكراره؟
حدد مراحل التخزين أثناء التصميم.

اختبر فهمك

1. أنشئ استيعابا للنصوص المقلمة غير الفارغة من [" a ", "", " b"].

اعرض الحل المشروح

استخدم [text.strip() for text in values if text.strip()] فتحصل على ["a", "b"]. إذا كان التوحيد مكلفا أو السياسة أعقد فاستخدم حلقة تحسب stripped مرة واحدة وتضيف غير الفارغ فقط، فتمنع تكرار العمل وتوضح القرار.

2. ماذا تفعل دالة تحتاج إلى مرورين على مكرر مدخل؟

اعرض الحل المشروح

إما إعادة تصميم الحساب لمرور واحد، أو اشتراط مجموعة قابلة للتكرار، أو حفظ البيانات ضمن حد موثق. لا تفترض أن التكرار يعيد المصدر للبداية؛ فمكرر الملف والمولد يحتفظان بحالة الاستهلاك، ويتغير الاختيار في الذاكرة والسلوك الملحوظ.

أهم ما تعلمته

  • ليوضح الاستيعاب تحويلا قصيرا.
  • يحمل المكرر تقدم مرور واحد.
  • الكسل وحدود التخزين خصائص صريحة للخط.

المراجع الرسمية