دورة تطوير بايثون المتقدمة
الفصل
>
المستوى
وحدات السلاسل والوقت
وحدة السلسلة
الهدف
قم بجمع بيانات التطبيق وأرسل رسائل الرد باستخدام وحدة السلسلة.
الآن بعد أن تم احتساب المواد اللازمة لبناء المزرعة الجديدة، حان الوقت لتوجيه انتباهنا إلى الموظفين الجدد للمزرعة. لدينا عدة رسائل يجب إرسالها لطلبات التوظيف، وطبيعي أن يستلزم ذلك الكثير من الكتابة، ومع ذلك يمكننا استخدام وحدة السلسلة لتعويض ذلك مما يسمح لنا بإنشاء قوالب وتنسيق النص لجعل التعامل مع كتل النص أسهل.
سيتم استيراد وحدة السلسلة هذه المرة بطريقة مختلفة قليلاً عن الوحدات الأخرى حيث سنستورد الفئات التي تمد الوحدة، وسيتم تنفيذها بالشكل التالي:
import string from string import Template from string import Formatter
يمنحنا هذا الوصول إلى الوحدة نفسها بالإضافة إلى الوصول إلى فئات القوالب والتنسيق التي تتضمن وظائفها الخاصة. لأغراضنا، سنستخدم الدوال والفئات التالية:
string.capwords(): تقوم هذه الدالة بتحويل كلمات السلسلة إلى تنسيق صحيح، بحيث يصبح الحرف الأول من الكلمة كبيراً وباقي الحروف صغيرة بغض النظر عن كيفية تنسيق السلسلة.Template(): هذه فئة من فئات السلسلة، تُستخدم لإنشاء كائن قالب. تستخدم الدالةsubstitute()التي تسمح لك بإعداد سلسلة وتحديد موقع باستخدام رمز$لاستبدال البيانات. يتيح لك ذلك إنشاء سلاسل معيارية يمكنك استخدامها حسب الحاجة.Formatter(): هذه فئة من فئات السلسلة، تُستخدم لتنسيق أو تأليف سلسلة. تعمل بطريقة مشابهة لفئةTemplate()ولكنها أكثر قوة وملائمة للتسلسلات النصية الكبيرة. تستخدم الدالةformat()التي تسمح لك بإعداد سلسلة وإدراج بيانات نصية باستخدام{}.
ابدأ بالسير نحو علامة X الفاتحة واستخدام دالة read() أثناء مواجهة خزانة الملفات، هذا سيسمح لك بالوصول إلى المجلدات التي تحمل أسماء المتقدمين المختلفة. تتواجد هذه المجلدات في شكل ثلاث ثوابت قائمة (3) تحمل الأسماء: folder_a , folder_b و folder_c.
سِر نحو علامة X الداكنة على السجادة الخضراء وواجه المكتب. أنشئ ثلاث قوائم (3) تُسمى: names_a , names_b , و names_c. استخدم تجميع القوائم مع دالة string.capwords() لتنسيق الأسماء بالحروف الكبيرة الصحيحة. قارن بين القوائم والثوابت التي تستخدم الحروف نفسها في أسمائها، على سبيل المثال بالنسبة لـ names_a استخدم string.capwords() مع folder_a، كالتالي: names_a = [string.capwords(x) for x in folder_a]. استخدم نفس الصيغة لملء القوائم names_b و names_c.
أنشئ قائمة باسم all_names واجمع قوائم الأسماء الثلاثة (3) كالتالي: all_names = names_a + names_b + names_c. سيؤدي ذلك إلى دمج جميع القوائم في قائمة واحدة أكبر، ثم استخدم دالة بايثون join() لدمج جميع عناصر القائمة في سلسلة نصية. يمكنك أيضاً تحديد ما يوضع بين كل عنصر من عناصر القائمة عن طريق وضعه بين علامات اقتباس، كالتالي: all_names = ", ".join(all_templates). استخدم الدالة المكتوبة مسبقاً write() مع قائمة all_names لتدوين جميع الأسماء بتنسيقها الصحيح.
بعد ذلك، تقدم إلى علامة X الذهبية وواجه المكتب، هنا سنقوم بإعداد القوالب. سيكون لدينا كائنان من القوالب المكتوبة مسبقاً يُسمى red_templates و blue_templates:
red_template = Template( "Hello, $name , thank you for applying for this position.") blue_template = Template( "Esteemed , $name , your application has been approved.")
كل من هذه القوالب لها رسالة فريدة، ومع ذلك فإنها تشترك فيما بينها في عنصر نائب واحد وهو $name. يُستخدم الرمز $ لتحديد عنصر نائب يمكن استبداله بسلسلة من اختيارك، وفي هذه الحالة كما يشير العنوان، هو اسم. إذا لم يتم استبدال أي قيمة، فإن القالب سيستخدم عنصر النائب في السلسلة كما هو. لتكملة ذلك، أنشئ قائمة باسم all_templates.
أنشئ حلقة for بأربع دورات (4)، وبهذا سنستبدل الأسماء في قوائم الأسماء الثلاثة (3) بالقوالب التي تتضمن الأسماء. على سبيل المثال، سنطبّق red_template على قائمة names_a. استخدم الدالة substitute() لفئة Template() لاستبدال عنصر النائب $name في القالب بالأسماء الموجودة في القائمة.
for x in range(4): names_a[x] = red_template.substitute(name=names_a[x])
افعل الشيء نفسه مع names_b و names_c، ففي حالة names_b استخدم red_template أيضاً، وفي حالة names_c استخدم blue_template.
بمجرد تعبئة جميع قوائم الأسماء بالقوالب الجديدة، حان الوقت لمراجعتها. أنشئ قائمة جديدة باسم all_templates وأضف إليها جميع قوائم الأسماء معاً، كالتالي: all_templates = names_a + names_b + names_c. استخدم نفس دالة join() كما في السابق لتجميع جميع الأسماء المُعالجة في شكل قابل للقراءة، كالتالي: all_templates = "\n".join(all_templates). استخدم الدالة المكتوبة مسبقاً write() مع all_templates لتوضيح جميع العناوين للأسماء المختلفة.
بعد ذلك نتقدم إلى علامة X الداكنة على السجادة الحمراء ونتوجه إلى المكتب، هنا سنقوم بتنسيق وكتابة المجموعة الأولى من الرسائل. ابدأ بإنشاء كائني تنسيق (2) يُسمى red_1 و red_2 مع تحديد الفئة، كالتالي: red_1 = Formatter()، red_2 = Formatter(). لتأليف الرسائل، أنشئ قائمة باسم red_letters.
كما في السابق، سنقوم بإنشاء حلقة for بأربع دورات (4)، حيث سيكون لدينا مجموعتان من السلاسل المكتوبة مسبقاً التي سيتم تنسيقها باستخدام الدالة format() وإضافة متغيرات الأسماء إليها. سيتم إضافة هذه السلاسل المنسقة إلى قائمة red_letters لتشكيل قائمة شاملة من الرسائل التي سيتم إرسالها. على سبيل المثال، سيتم تنسيق كائنات red_1 مع قائمة names_a وإضافتها إلى قائمة red_letters.
for x in range(4): red_letters.append(red_1.format( "{} Orientation will begin next week, please report to the office..." , names_a[x]))
افعل الشيء نفسه مع كائن التنسيق red_2 باستخدام السلسلة المكتوبة مسبقاً وأضف names_b إلى الحلقة. بمجرد إعداد كل ذلك، استخدم دالة join() مع red_letters لتجميع البيانات في ملف واحد، كالتالي: red_letters = "\n".join(red_letters). استخدم الدالة write() مع red_letters لتدوين جميع الرسائل المنسقة التي سيتم إرسالها.
أخيراً، اتجه نحو علامة X الداكنة على السجادة الزرقاء وواجه المكتب، هنا سنقوم بتنسيق وتأليف المجموعة الأخيرة من الرسائل. كما في السابق، أنشئ كائني تنسيق (2) يُسمى blue_1 و blue_2 مع تحديد الفئة، كالتالي: blue_1 = Formatter()، blue_2 = Formatter(). أنشئ قائمة blue_letters لتنسيق وتأليف جميع الرسائل.
مرة أخرى، أنشئ حلقة for بأربع دورات (4) واستخدم السلاسل المكتوبة مسبقاً لتنسيق قوائم الأسماء وإضافتها إلى قائمة blue_letters باستخدام الدالة format(). في هذه الحالة، استخدم كائنات التنسيق blue_1 مع قائمة names_c وكائنات التنسيق blue_2 مع قائمة names_b. يتم ذلك بنفس طريقة تنفيذ العملية على السجادة الحمراء، ولكن باستخدام قيم مختلفة، مما يُظهر تعددية استخدام التنسيقات والقوالب. بمجرد الانتهاء، استخدم الدالة write() مع blue_letters لتسجيل آخر الرسائل وإكمال المستوى.