الدرس 10 من 10

المولّدات الكسولة

هدف الدرس

قيمة عند الطلب لا قائمة كاملة

01

الشرح

الدالة العادية تحسب كل شيء ثم تُرجعه مرّة واحدة، أما الدالة التي فيها yield فتصير مولّدًا (generator)، فكلما وصلت إلى yield سلّمت قيمة وتوقّفت في مكانها، ولا تُكمل حتى تُطلب منها القيمة التالية.

وعندما تستدعيها لا يُنفَّذ منها أي سطر، بل تحصل على كائن مولّد فقط، ثم تطلب منه قيمة واحدة بـ next(gen)، أو تطلب كل القيم حتى النهاية بـ for أو list(). وهذا ما يُسمّى التقييم الكسول (lazy evaluation)، وهو الذي يسمح لك بقراءة ملف فيه مليون سطر سطرًا بعد سطر دون أن تحمّله كله في الذاكرة.

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

02

المطلوب

اكتب مولّدين، الأول parse(lines) يُسلّم (name, amount) من كل سطر غير فارغ على أن يكون المبلغ رقمًا صحيحًا، والثاني large(orders, limit) يُسلّم الطلبات التي مبلغها limit فأكثر، ثم صِل بينهما هكذا: big = list(large(parse(log), 100)).

الفحوص

5 فحوص
  1. الدالتان parse وlarge مولّدان
  2. الدالة parse تُسلّم الاسم والمبلغ رقمًا وتتخطّى السطر الفارغ
  3. الدالة large تُسلّم ما بلغ الحدّ فأكثر
  4. المتغيّر big قائمة بنتيجة السلسلة كاملة
  5. السلسلة كسولة وnext لا تقرأ أكثر ممّا تحتاج
main.py
المخرجاتPython (Pyodide)

نحمّل بيئة Python الآن. يحدث هذا مرّة واحدة فقط، ثم يحفظها متصفّحك.

–/5

يبدأ الفحص حين تجهز البيئة.

تجد 5 فحوص في بطاقة «المطلوب».