تمرين بايثون لأسماء الأطفال

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

توجد ملفات هذا التمرين في دليل "babynames" داخل google-python-exercises (قم بتنزيل google-python-exercises.zip إذا لم يكن لديك ملف بالفعل، انظر الإعداد للحصول على التفاصيل). أضِف رمزك في Babynames.py. ملفات Baby1990.html Baby1992.html ... التي تحتوي على لغة html الأولية، بشكل مشابه لما تحصل عليه في موقع التأمين الاجتماعي أعلاه. ألق نظرة على html وفكر في كيفية استخراج البيانات منه.

الجزء (أ)

في ملف Babynames.py، نفِّذ الدالة remove_names(filename) التي تأخذ اسم ملف Baby*.html وتعرض البيانات من الملف كقائمة واحدة - سلسلة السنة في بداية القائمة متبوعة بسلاسل ترتيب الاسم بترتيب أبجدي. ['2006', 'Aaliyah 91', 'Abagail 895', 'Aaron 57', ...]. عدِّل main() بحيث تستدعي الدالة استخراج_names() وتطبع ما تعرضه (يحتوي الرئيسي على التعليمة البرمجية لتحليل وسيطة سطر الأوامر). إذا واجهتك مشكلة في تنفيذ التعبيرات العادية للسنة وكل اسم، فسيتم عرض أنماط التعبير العادي للحل في نهاية هذا المستند. تجدر الإشارة إلى أنّه عند تحليل صفحات الويب بشكل عام، لا تؤدي التعبيرات العادية أداءً جيدًا، ولكن صفحات الويب هذه تكون بتنسيق بسيط ومتسق.

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

يمكنك إنشاء البرنامج كسلسلة من المعالم الرئيسية الصغيرة، والحصول على كل خطوة لتشغيل/طباعة شيء ما قبل تجربة الخطوة التالية. هذا هو النمط الذي يستخدمه المبرمجون ذوو الخبرة -- بناء سلسلة من المعالم الرئيسية الإضافية، لكل منها بعض المخرجات للتحقق منها، بدلاً من بناء البرنامج بأكمله في خطوة كبيرة واحدة.

تساعدك طباعة البيانات التي لديك في نهاية معلم رئيسي على التفكير في كيفية إعادة هيكلة تلك البيانات للمعلم الرئيسي التالي. تتناسب لغة بايثون بشكل جيد مع هذا النمط من التطور التدريجي. على سبيل المثال، انتقل أولاً إلى النقطة التي تستخرج فيها السنة وتطبعها وتستدعي sys.exit(0). فيما يلي بعض المعالم الرئيسية المقترحة:

  • استخرِج النص كله من الملف واطبعه.
  • البحث عن العام واستخراجه وطباعته
  • استخرِج الأسماء ورتِّب الأرقام واطبعها
  • الحصول على بيانات الأسماء في إملاء وطباعتها
  • إنشاء قائمة [السنة، 'ترتيب الاسم'، ... ] وطباعتها
  • إصلاح الإصدار الرئيسي() لاستخدام قائمة استخراجNames

في وقت سابق، كانت لدينا دوال تطبع فقط إلى إخراج قياسي. من الأسهل إعادة استخدام الدالة *return* البيانات المستخرجة، بحيث يكون لدى المتصل الاختيار طباعتها أو القيام بشيء آخر بها. (ما زال بإمكانك الطباعة مباشرةً من داخل الدوال لاستخدامها في تجاربك الصغيرة أثناء التطوير).

احصل على استدعاء main() لكل وسيطة سطر أوامر واطبع ملخصًا نصيًا. لتحويل القائمة إلى نص ملخّص يبدو معقولاً، إليك الاستعانة بأداة join بارعة: text = '\n'.join(mylist) + '\n'

يجب أن يظهر نص الملخص على النحو التالي لكل ملف:

2006
Aaliyah 91
Aaron 57
Abagail 895
Abbey 695
Abbie 650
...

الجزء (ب)

لنفترض أننا نريد كتابة ملفات تحتوي على النص بدلاً من طباعة النص بشكل قياسي. إذا كانت العلامة --summaryfile موجودة، فنفذ ما يلي: لكل ملف إدخال 'foo.html'، بدلاً من الطباعة إلى إخراج قياسي، اكتب ملفًا جديدًا باسم 'foo.html.summary' يحتوي على نص الملخص لذلك الملف.

عند عمل ميزة --summaryfile، شغِّل البرنامج على جميع الملفات باستخدام علامة * على النحو التالي: "./babynames.py --summaryfile Baby*.html". يؤدي هذا إلى إنشاء جميع الملخّصات في خطوة واحدة. (يتمثّل السلوك العادي لواجهة المستخدم في توسيع نمط "baby*.html" إلى قائمة أسماء الملفات المطابقة، ثم تشغِّل واجهة الأوامر ضبط Babynames.py، ما يؤدي إلى تمرير جميع أسماء الملفات هذه في قائمة sys.argv).

مع تنظيم البيانات في ملفات ملخص، يمكنك معرفة الأنماط بمرور الوقت باستخدام أوامر واجهة المستخدم، مثل ما يلي:

$ grep 'Trinity ' *.summary
$ grep 'Nick ' *.summary
$ grep 'Miguel ' *.summary
$ grep 'Emily ' *.summary

تلميحات التعبير العادي -- السنة: r'ًّا\sin\s(\d\d\d\d)' المُسمّى: r'<td>(\d+)</td><td>(\w+)</td>\<td>(\w+)</td>'