بايثون 2
بايثون 2
سبق ان تم التطرق الى اساسيات التعامل مع السالسل الرمزية للغة بايثون في الدرس الخامس الذي يمكن زيارته
من هنا.
اما اليوم فسنتكلم بشيء من التفصيل عن كيفية التعامل مع السالسل الرمزية ألهميتها في التعامل مع النصوص في
الملفات النصية وحتى في ملفات الوسائط المتعددة وكبداية بسيطة تعرف السلسلة الرمزية ( )Stringفي كل لغات
البرمجة على انها سلسلة من الحروف او األرقام او الرموز الخاصة محصورة بين عالمتي اقتباس مفردة او مزدوجة
يمكن تحويل السالسل الرمزية الى ارقام صحيحة او عشرية باستخدام الدالتين )(int() and float
1
على التوالي كما ذكرنا في الدرس الخامس ويمكن دمج ( )concatenateسلسلتين رمزيتين بوضع عالمة ()+
وكما نالحظ هنا فقط تم التعامل مع ( )x,yعلى انها سالسل رمزية وقامت عالمة ( )+بأرفاق الثانية في نهاية األولى
في حين تم التعامل مع ( )z,wعلى انها اعداد صحيحة وقامت عالمة الجمع ( )+بطباعة ناتج جمعهما.
كذلك يمكن قراءة السالسل الرمزية من دالة االدخال ( )inputثم تحويلها وكما في ادناه:
2
وكما نالحظ هنا فقد قمنا بإدخال سلسلة رمزية تحت مسمى ( )xثم تحويلها الى عدد عشري واعطيناه اسم متغير ()y
ثم الحظنا ان استخدام الضرب (*) بين ال ( )xونفسه اعطى رسالة خطأ ألنهما سالسل رمزية ال يمكن ضربها ولكنه
اعطى ناتج الضرب للقيمة ( )y*yألنهما عددان عشريان يمكن ضربهما وهكذا.
الى هنا يتضح لنا سهولة التعامل مع السالسل الرمزية كوحدة واحدة وكيفية تحويلها الى اعداد صحيحة او عشرية
ولكن االستخدام األهم للسالسل الرمزية يتضمن الدخول الى داخل السلسلة الرمزية والتعامل مع مكوناتها كوحدات
حيث يمكننا ترقيم الرموز بداخل السلسلة الرمزية بدءا من الصفر من اليسار الى اليمين او من السالب واحد من
3
وهنا من الواضح اننا قمنا بإدخال سلسلة رمزية تحت اسم متغير ( )xثم محاولة طباعة الرمز الثاني (] )x[1والرمز
كذلك استطعنا معرفة طول السلسلة الرمزية (عدد رموزها) من الدالة المعرفة بداخل لغة بايثون ( len(xورغم ان
طول السلسلة 81اال ان الرمز (] )x[18غير موجود ألننا بدأنا الترقيم من الصفر أي ان اخر عنصر في سلسلة
كذلك يمكن استخدام عبارات الشرط والتكرار مع السالسل الرمزية وكما في ادناه:
4
حيث تم استخدام أداة ( )whileوباالستعانة بدالة طول السلسلة لعرض عناصر السلسلة مع فهرس ( )indexكل
منها.
وكما نالحظ فأن القيام بذلك بهذه الطريقة أسهل بكثير مما كان مع ( .)whileكما نالحظ هنا اننا لم نحتج الى استخدام
دالة طول السلسلة الرمزية ()( )lenألننا قمنا بحساب طول السلسلة باستخدام اللوب وال (.)count
5
كذلك يمكن استخدام الحلقات التكرارية والشروط لحساب عدد مرات تكرار رمز معين في السلسلة وكما في المثال
التالي:
حيث قام الكود أعاله بحساب عدد مرات ورود الرمز ( )aفي السلسلة الرمزية.
من األمور المهمة األخرى حول السالسل الرمزية والتي تم التطرق لها بشكل مختصر في الدرس الخامس هي تشريح
او تقطيع السالسل الرمزية ( )string slicingوذلك بطباعة جزء من السلسلة الرمزية يبدأ برقم معين وينتهي برقم
6
استخدام ( )inكدالة منطقية:
ذكرنا سابقا ان عبارة ( )inالمحفوظة في لغة بايثون لها استخدامات كثيرة مع عبارات التكرار والشروط وهنا يمكن
هناك الكثير من الدوال المحفوظة في لغة بايثون للتعامل مع السالسل الرمزية وسنتطرق الى بعضها في األمثلة
التالية:
7
ويمكن االطالع على تفاصيل أكثر ودوال أكثر عن السالسل الرمزية على الرابط التالي:
https://docs.python.org/2/library/stdtypes.html#string-methods
من اهم الدوال المحفوظة في لغة بايثون للتعامل مع السالسل الرمزية هي دالة البحث ()( )findوالتي يمكن
استخدامها للعثور على رمز او مجموعة رموز وتعيد قيمة فهرس ( )indexاول ظهور لتلك المجموعة او الرمز
كقيمة عددية وفي حالة عدم إيجاد الرمز المطلوب تقوم بأرجاع قيمة ( )8-وكما في ادناه:
8
البحث واالستبدال باستخدام دالة ()(:)replace
يمكن استخدام دالة ()( )replaceإليجاد رمز معين او مجموعة رموز واستبدالها برمز او مجموعة رموز وكما في
ادناه:
9
حيث ال يشترط كما الحظنا ان تكون السالسل التي نستبدلها بنفس الطول.
كما هي عادة الكتابة باستخدام لوحة المفاتيح ،تحتوي الكثير من الكلمات والجمل على مسافات فارغة قبل وبعد
10
ومن الجميل ان نالحظ ان هذه الدوال ال تتالعب بالفراغات بين الكلمات في الجملة الواحدة مما ال يؤثر على المعنى.
دالة ()()startswith
11
حيث يتم اسناد قيمة صح ( )trueاو خطأ ( )falseاعتمادا على مقارنة القيمة المعطاة داخل دالة ()()Startswith
مع الرمز او مجموعة الرموز التي تبدأ بها السلسلة الرمزية االصلية .بخصوص الحالة األخيرة اعادت الدالة خطأ
بالرغم من انها تبدأ بالحرف ( )pألن لغة بايثون حساسة لحالة الحروف ( )letter case sensitiveأي انها تفرق
استخالص جزء من السلسلة الرمزية يبدأ برمز معين وينتهي برمز معين اخر:
وهو مهم جدا في التعامل مع السالسل الرمزية لمواقع االنترنت وكما سنرى الحقا ان شاء هللا.
واخيرا اليكم مثال محلول يوضح بعضا من خصائص السالسل الرمزية وكيفية التعامل معها:
12
التعامل مع الملفات Files
كل ما تعاملنا معه لحد االن هو بيانات مؤقتة مخزونة في الذاكرة الرئيسية ( )RAMولم نصل بعد الى التعامل مع
ملفات او بيانات مخزونة مسبقا ً في القرص الصلب الستدعائها الى المعالج لغرض معالجتها وإعادة خزنها وهو ما
الملفات :هي تجمع من البيانات المرتبطة ببعضها البعض في مكان واحد (او عدة مكانات موزعة) في الذاكرة .وسنركز
في درس اليوم على التعامل مع الملفات النصية ( )text filesلقراءة محتوياتها والتنقل بينها والتعديل عليها او التقاط
قبل التعامل مع محتويات ملف نصي معين يجب ان نقوم بقراءته ويتم ذلك باستخدام الدالة Open():ويشترط في الملف
الذي نريد قراءته ان يكون مخزون في نفس مكان ملف البرنامج الذي نعمل عليه ،أي اننا ان قمنا بأنشاء ملف جديد
بامتداد ( ).pyوقمنا بفتحه بأحد المفسرات للتعامل معه وقمنا باستدعاء الدالة ()( )openفيجب ان يكون الملف الذي
نريد فتحه موجود في نفس مكان خزن ملف ال ( )*.pyوكما في المثال ادناه:
13
هنا نشرح البرنامج وكما في ادناه:
السطر األول :اسناد ما في الملف ( )first.txtالى متغير اسمه ( )xمع إعطاء نمط الفتح ( )modeالحرف ( )rويعني
قراءة ملف ( )readبدون التعديل عليه واما إذا أردنا فتحه والكتابة بداخله فنستخدم الحرف ( )wمن كلمة كتابة ()write
وجدير بالذكر ان النمط ( )modeاختياري أي اننا يمكن ان نكتب عبارة ()( )openبدون عبارة االستدعاء للنمط.
مالحظة :اسم الملف وامتداده والنمط يجب ان تكون محصورة بعالمات اقتباس مفردة او مزدوجة.
السطر الثاني :عبارة تكرار forللتنقل بين مكونات الملف المحفوظ االن في المتغير (.)x
مالحظة مهمة جداً :نالحظ ان الملف المطبوع يختلف عن الملف الموجود في الملف النصي بوجود سطر فارغ بين
السطرين في الملف والسبب في ذلك ان كل سطر في الملفات يتم استدعائه وبعده عبارة ( )\nأي النزول الى سطر جديد
14
وألن اخر رمز في أي سطر هو ( )\nايضا ً فيحصل قفز سطرين أي ترك سطر فارغ في الوسط وللتخلص من هذه
وهنا نالحظ اننا استدعينا دالة قص الفراغات الى اليمين ()( )rstripالتي تحدثنا عنها في الدرس السابق لتخليصنا من
السطر الفارغ بين السطرين بل وكل االسطر الفارغة في الملف (إذا كان يحتوي على الكثير من االسطر).
مالحظة :ان دالة ()( )openهي ليست لحفظ الملف كله في متغير وانما لفتح نافذة بين الذاكرة الثانوية (الهارد) والذاكرة
15
وكما يوضحه المثال ادناه:
هنا نرى ان طباعة المتغير ( )xال تعطينا محتويات الملف وانما شيء يسمى ( )handlerوهو مفتاح او قناة توصيل
بين الذاكرة الرئيسية والثانوية ومن هنا نعلم ان الطريقة الوحيدة للوصول الى محتويات الملف باستخدام دالة ( )forكما
في حالة محاولة فتح ملف غير موجود سنحصل على رسالة خطأ كما في ادناه:
16
مرة أخرى نعود الى الرمز سطر جديد ( )\nفهو يعتبر رمزاً خاصا ً في لغة بايثون وكما يوضحه المثال التالي:
هنا نالحظ ان الرمز ( ) \nعلى الرغم من كونه موجود بداخل عالمات اقتباس اال ان اللغة عرفت انه خاص بالنزول
الى سطر جديد وهذا ما حدث عند استخدام عبارة الطباعة وكذلك حين استعلمنا عن طول ( )lengthالسلسلة الرمزية
( )yقام بأخبارنا ان طولها 3اي انه تعامل مع ( )\nعلى انه رمز واحد فيجب االنتباه.
17
ولتوضيح المعنى أكثر تصور ان كل ملف هو مجموعة من االسطر وان كل سطر يحتوي في نهايته على رمز ()\n
18
وكما هو موضح في التعليقات امام كل سطر برمجي.
19
حيث قمنا باستخدام دالة ()( )startswithلطباعة السطر الذي يبدأ برمز معين او كلمة معينة او مجموعة رموز.
كذلك يمكن استخدام التقنية التالية لالستمرار في الحلقة التكرارية في حالة عدم توفر شرط معين او في حالة تحققه وكما
حيث ان الشرط هنا انه ان كان السطر ال يبدأ بعبارة ( )helloفأكمل الحلقة التكرارية واال فأطبع عبارة ( starts with
.)helloكذلك يمكن البحث بداخل كل سطر من الملف باستخدام عبارة ( )inوكما في ادناه:
20
لحد االن كنا نتعامل مع ملف قمنا بإدخال اسمه من ضمن البرنامج وهذا ليس الوضع عادة حيث نريد ان نعطي للمستخدم
قابلية قراءة أي ملف يعرف اسمه ويقوم بتنفيذ أوامر معينة عليه وكما في ادناه:
21
وهنا قمنا بإد خال اسم الملف والذي يظهر اسمه ومحتوياته في الزاوية العليا اليسرى من الصورة أعاله والبرنامج الى
وكما في كل البرامج السابقة يجب ان نأخذ بنظر االعتبار ان المستخدم قد يقوم بإدخال اسم ملف خاطئ او بدون امتداد
22
حيث استخدمنا عبارة ( ) try exceptionلطباعة رسالة خطأ للمستخدم وانهاء التنفيذ ويمكن عدم انهاء التنفيذ والقيام
بأي عمل اخر بحسب رغبتنا وما يريده المستخدم النهائي منا.
واخيراً ارفق لكم مجموعة من األمثلة المحلولة للتعامل مع الملفات ومحتوياتها عسى ان تنفعكم
23
24
كما في كل درس أتمنى ان تكون المادة المشروحة واضحة وانا حاضر ألي سؤال او استفسار وأتمنى التفاعل والمساعدة
في النشر لهذه الدروس لتعميم الفائدة وهللا الموفق لكل خير.
25
القوائم في لغة بايثون Lists
القوائم ( )listsهي تجمع لعدد من البيانات في مكان واحد وتحت اسم واحد وهي تشبه الى حد كبير المصفوفات أحادية
البعد في لغات البرمجة األخرى وقد تم التطرق لها والتعامل معها منذ بداية الدورة والدروس األولى وميزتها اننا ال
نحتاج الى تعريفها بل نستخدمها مباشرة وال يشترط بعناصرها ان تكون من نوع واحد فقد يكون بعضها اعداد صحيحة
وكما تالحظون فما كتبناه هنا ليس جديداً في شيء فنحن قد تعاملنا مع مثل ذلك في اغلب الدروس السابقة وعرفنا كيف
نقوم بإدخال القائمة محصورة بقوسين من النوع الكبير ][ وتفصل بين عناصرها فارزة ولو كان ضمن عناصرها رموز
او سالسل رمزية فيجب حصرها بعالمات اقتباس مفردة او مزدوجة .وعرفنا أيضا ً كيف يمكننا الوصول الى أي عنصر
في القائمة وكما في أعاله .واخيراً عرفنا ان استدعاء عنصر خارج نطاق القائمة يسبب ظهور رسالة خطأ
(.)traceback
كما ذكرنا فأن القائمة هي تجمع لعدة متغيرات في مكان واحد واما تعريف متغير مفرد فليس قائمة وكما في ادناه:
26
وهنا نالحظ ان ( )x,y,zهي متغيرات ولكن ( )wهي قائمة وهكذا.
القوائم في لغة بايثون قد تكون فارغة وقد تحتوي عدد محدد او غير محدد من العناصر وقد تحتوي قوائم فرعية (sub-
27
وهنا نالحظ ان ( )xقائمة فارغة و( )yليست فارغة و ( )zقائمة تحتوي 7عناصر بعضها متغيرات او ثوابت وبعضها
قوائم فرعية .واخيراً يمكن استخدام اشارة الجمع ( )+ألرفاق ( )appendالقوائم بعضها ببعض حيث أرفقنا القائمة ()z
انشاء القوائم:
سبق ان تعلمنا كيفية انشاء قائمة او التعامل معها واليكم بعض الطرق لذلك:
االمر االخر المهم حول القوائم هو الفرق المهم بين قوائم الرموز وقوائم األرقام حيث يمكن تغيير محتويات قوائم األرقام
ولكن ال يمكن التالعب بمحتويات قوائم الرموز في البايثون ( )2.7ولكن كل ذلك ممكن في البايثون ( )3وما بعده وكما
28
ايضا ً لمعرفة طول القائمة نستخدم دالة ()( )lenوكما في ادناه:
29
من أدوات انساء القوائم التلقائية هي الدالة ()( ) rangeالتي تستخدم ألنشاء قوائم تحتوي عدد من الرموز يساوي العدد
كما ذكرنا سابقا ً ايضا ً يمكن ايضا ً تشريح ( )slicingالقوائم بطباعة جزء او أجزاء منها وكما في المثال ادناه:
30
وقد تم سابقا ً شرح معنى كل من االيعازات أعاله.
دوال القوائم:
كما ذكرنا سابقا ً فأحد أبرز الدوال المستخدمة مع القوائم هي دالة ()( )listألنشاء دالة فارغة واما دالة ()()type
فتستخدم إلرجاع نوع القائمة او المتغير كما رأينا سابقا ً واخيراً هناك دالة المجلد ()( )dirوالتي تعرض كل الدوال
31
هنا قد يتساءل البعض عن كيفية االستفادة من دالة ()( )listوالتي تبني قائمة فارغة؟ والجواب يمكن معرفته من المثال
التالي:
32
استخدام أدوات ( )in, not inالختبار وجود او عدم وجود عنصر معين في القائمة :يوضحه المثال التالي:
33
كيفية ترتيب قائمة ابجديا ً للرموز والسالسل الرمزية ومن الصغير للكبير بالنسبة لألرقام:
34
بعض الدوال المحفوظة في لغة بايثون للتعامل مع القوائم:
35
هنا قمنا بتعريف متغير اسمه ( )aونوعه سلسلة رمزية ثم قمنا بتجزئته ()( )splitووضع األجزاء على شكل قائمة في
المتغير ( )bثم قمنا بعمل نفس الشيء مع ال ( )cوال ( )dاال ان الفرق الوحيد اننا جزئنا ال ( )aعلى أساس المسافات
الفارغة ( )spacesوهو ما يحصل حين نترك دالة ( )Splitفارغة واما مع ال ( )cفقد قمنا بالتجزئة اعتماداً على
الحرف ( )bحيث يتم تجزئة السلسلة الرمزية الى مجموعة سالسل او مجموعة عناصر في قائمة عند كل ذكر للحرف
مالحظة :عند ترك دالة ( )splitفارغة فأن أي عدد من الفراغات ( )spacesبين الحروف والكلمات يعتبر مسافة واحدة
واخيراً اليكم مثال عن كيفية التعامل مع أجزاء النصوص والسالسل الرمزية وكيفية الوصول الى ادق التفاصيل باستخدام
36
37
38
المجلدات او القواميس في لغة بايثون Dictionaries
وهي أحد أنواع البيانات او مجاميع البيانات ( )collectionsوالتي تسمح بجمع مجموعة غير مرتبة من األسماء والقيم
( )values and keysووضعها تحت اسم واحد وهذا هو فرقها الرئيسي عن القوائم التي تتميز بترتيب عناصرها وهي
أكثر مرونة من القوائم التي سبق شرحها ويمكن التعبير عن المجلد بالصورة التوضيحية التالية:
39
حيث ان المجلد يشبه الحقيبة التي تحتوي مجموعة من األشياء وبأعداد مختلفة والهدف الرئيسي من إيجاد المجلدات في
لغة بايثون لتسهيل عملية حساب عدد مرات تكرار عنصر معين (رمز او رقم او سلسلة رمزية) في ملف او سطر من
ملف نصي.
وهنا عرفنا مجلد اسمه ( )classroomباستخدام دالة ()( )dictوقمنا بإضافة عناصره واحداً بعد االخر ثم حين طلبنا
طباعته جاءت النتيجة كما هو متوقع بترتيب مغاير لما تم إدخاله وهو امر يختلف عما اعتدنا عليه في القوائم وبعدها
ومن مميزات المجلدات عملها كقواعد بيانات للغة بايثون تمكننا من الوصول الى أي عنصر بمعرفة مفتاحه ()the key
ليرجع لنا القيمة المحفوظة بداخله ( )the valueوحين طلبنا قيمة لمفتاح غير معرف جاءت رسالة الخطأ ()traceback
40
واالن لمعرفة الفرق بين القوائم والمجلدات أكثر الحظوا المقارنة التالية:
واالن ألنشاء قائمة فارغة عرفنا اننا نستطيع فعل ذلك باستخدام دالة ()( )listكما في الصورة أعاله وألنشاء مجلد فارغ
فقط نستخدم الدالة ()( )dictولكن يمكن ايضا ً انشاء مجلد فارغ باستخدام اقواس المجموعة فارغة وكما في ادناه:
كما ذكرنا قبل قليل فأن اهم تطبيق للمجلدات معرفة عدد مرات تكرار رقم او حرف او سلسلة رمزية في سطر او ملف
نصي وهذا هو ما سنركز عليه في شرحنا لهذا الدرس علما ً ان المجلدات يمكن ان تستخدم في امكان أخرى عديدة
واالن إذا ان هناك قائمة من األسماء واردنا معرفة أي اسم تكرر أكثر من األسماء األخرى فكل ما علينا فعله هو انشاء
مجلد وتسميه مفاتيح مشابهة لألسماء واضافة 1الى قيمة االسم كلما تكرر ذكره وكما في ادناه:
41
يمكن ايضا ً استخدام دالة ( )inكدالة منطقية لمعرفة هل يوجد مفتاح معين في المجلد او ال وكما في ادناه:
42
واالن نعود الى مثالنا عن عدد مرات تكرار اسم معين .حيث الحظنا في الحالة السابقة اننا نقوم بإضافة األسماء وعدد
مرات تكرارها يدويا ً كل مرة وهذه طريقة غير مجدية برمجيا ً خصوصا ً ان كنا نتعامل مع ملف يحتوي االلف الكلمات
من المثال أعاله نالحظ اننا نستطيع استخدام دالة ( )forللتنقل بين عناصر المجلد كما في القوائم تماما ً مستخدمين اسمها
وسيقوم المفسر باستخدام قيم المفاتيح ( )keysللتنقل بين عناصر المجلد وهنا قلنا للمفسر انه لكل اسم ( )nameوهو
اسم متغير عشوائي موجود في مجلد األسماء :ان كان غير موجود في قائمة االعداد السابقة فأجعل قيمته 1واال فأضف
الى قيمته السابقة 1وبذلك نكون قد قمنا بعد كل األسماء ومعرفة عدد مرات تكرار كل منها.
واالن ألن السيناريو أعاله يتكرر بكثرة عند استخدام المجلدات فقد تم بناء دالة خاصة فقط تقوم بكل ما ذكر أعاله واسم
إذا كان المفتاح موجوداً في القائمة المعدة مسبقا ً تقوم بإضافة واحد له.
43
إذا كان المفتاح غير موجود في القائمة تقوم بأسناد قيمة افتراضية ( )default valueله ونحن من نقوم بإعطاء القيمة
حيث تقوم الدالة هنا بعد األسماء وعدد مرات تكرار كل منها وتضيف القيمة االفتراضية لالسم الغير مذكور سابقا ً (.)0
واالن الصيغة العامة لحساب عدد مرات تكرار اسم معين او سلسلة رمزية معينة في المثال التالي:
44
واالن لنشرح البرنامج خطوة بخطوة:
السطر الثاني :طباعة عبارة على الشاشة تطلب من المستخدم ادخال سطر من الكلمات
السطر الثالث :استخدام عبارة االدخال للسماح للمستخدم بإدخال سطر البيانات.
45
السطر السادس :طباعة عبارة (… .)counting
السطر السابع والثامن والتاسع :عملية العد كما ذكرناها سابقا ً وطباعة النتائج
وكما ذكرنا سابقا ً فأن عبارة ( )forيمكن ان تستخدم للتنقل بين مكونات المجلد وكما في ادناه:
واما السترجاع مكونات المجلد كقوائم منفصلة للمفاتيح ( )keysاو القيم ( )valuesاو األزواج المرتبة للمفاتيح والقيم
46
كذلك من األمور المميزة في المجلدات إمكانية استخدام عبارة ( )forالمزدوجة بمتغيرين ليكون أحدهما معبراً عن
47
واخيراً وكملخص لكل ما درسنا لحد االن أتمنى التركيز على المثال التالي حيث يشرح كيفية توظيف كل الدوال
والمميزات التي شرحناها لحد االن عن السالسل الرمزية والملفات وأدوات االدخال واإلخراج والقوائم والمجلدات
لقراءة ملف وتجزئة محتوياته ثم التعامل مع كل منها على حدة لحساب عدد مرات تكرار كل كلمة ثم طباعة الكلمة التي
48
الصفوف او المجاميع Tuples
نصل اليوم الى شرح النوع الثالث من أنواع مجاميع البيانات في لغة البايثون بعد ان شرحنا القوائم ( )listsوالمجلدات
او القواميس ( )directoriesوهذا النوع يسمى الصفوف او المجاميع ( .)Tuplesوهذا النوع من البيانات يشبه الى حد
كبير القوائم في كونه يتكون من مجموعة من العناصر اال ان العناصر هنا تكون محصورة بين قوسين صغيرين () بدالً
من االقواس الكبيرة للقوائم ][ والميزة األهم للصفوف ان عناصرها غير قابلة للتعديل ( )immutableولذا تستخدم
عادة بشكل كفوء كبديل للقوائم والمجلدات في حالة الحاجة الى التعامل مع قوائم مؤقتة ( )Temporary listsبدون
الحاجة الى تغيير مكوناتها حيث انها تأخذ مساحة اقل من الذاكرة ووقتا ً اقل في المعالجة من قبل وحدة المعالجة المركزية
49
وهنا تتضح الفوارق الرئيسية بين القوائم والصفوف حيث رأينا ان ( )aهي قائمة يمكن استدعاء عناصرها وتغييرها
في حين ال يسمح الصف ( )bباستدعاء عناصره او تغييرها .كذلك لمعرفة نوع المجاميع التي نتعامل معها نستخدم دالة
يمكن التعامل مع الصفوف كمتغيرات تماما ً كما تعاملنا مع القوائم والمجلدات بإدخالها ضمن عبارات الشروط والتكرار
50
من مميزات القوائم األخرى انها وكما قلنا غير قابلة لتغيير عناصرها ولذا فهي غير قابلة للترتيب او اإلضافة او الحذف
51
ولمعرفة الدوال التي تعمل مع الصفوف نستخدم دالة ()( )dirكما في القوائم والمجلدات وكما في ادناه:
52
من مميزات الصفوف ايضا ً قابلية االسناد المزدوج واألكثر من المزدوج (اسناد عنصرين او أكثر الى قيمتين او أكثر
53
وهنا كما الحظنا استطعنا ان نسند عنصرين وهما ( )a,bالى قيم ( )5,6في ايعاز واحد كما رأينا كيف يمكن تنفيذ
ايعازات الجمع والضرب على الصفوف حيث ال يتم الجمع وال الضرب وانما ارفاق او تكرار الصف اكثر من مرة
54
وبحسب االيعاز .واخيراً رأينا كيف انه ال يمكن إضافة عناصر رمزية الى الصفوف وال يمكن ارفاق سلسلة رمزية مع
متغيرات صحيحة وهي أمور بديهية االن لمن تابع دورتنا من البداية
واالن للتنقل بين القواميس ( )dictionariesوالصفوف ( )tuplesنستخدم ايعاز ()( ).itemsليحول لنا المجلد او
55
واالن من مميزات الصفوف قابلية المقارنة بينها حيث ان كان الصف يتكون من 4عناصر واردنا المقارنة فيتم مقارنة
العنصر األول من الصف األول بالعنصر األول من الصف الثاني فأن تساويا فيتم االنتقال الى مقارنة العنصر الثاني
من الصف األول بالعنصر الثاني من الصف الثاني وهكذا وكما توضحه األمثلة التالية:
من المميزات الهامة للصفوف هو إمكانية ترتيب عناصرها باستخدام دالة ()( )sortedوكما في ادناه:
56
واالن نالحظ انه في المثال أعاله قمنا بترتيب عناصر القاموس اعتماداً على المفاتيح ( )keysواما لو أردنا الترتيب
57
واخيراً اليكم بعض األمثلة التي تجمع الكثير من المبادئ التي تعلمناها لحد االن:
المثال األول :فتح ملف وقراءة محتوياته ثم حساب عدد مرات تكرار كل كلمة وطباعة الكلمات العشرة األكثر تكراراً
58
المثال الثاني :قراءة ملف بريد الكتروني ومعرفة عدد الرسائل التي تم استالمها في كل ساعة واستخراج الساعات من
السطور التي تبدأ بكلمة ( ) Fromوتجزئة تلك االسطر الى حد الساعة ثم حساب عدد الرسائل لكل ساعة وترتيبها
وطباعتها جميعاً:
59
التعابير القياسية ()Regular Expressions
ربما الحظتم احبتي الكرام ان تركيزنا في هذه الدورة لحد االن هو على كيفية استخدام لغة بايثون الستخالص معلومات
مفيدة من ملفات بيانات نصية وهو ما ركز عليه الكتاب المنهجي لهذه الدورة ( )Python of Informaticsوالبد ان
اغلبكم يعلم ان تطبيقات بايثون ال تقتصر على هذا وانما على برمجة تطبيقات الحاسوب وبرمجة مواقع االنترنت
وبرمجة األجهزة المستخدمة في السيطرة والتحكم والكثير الكثير من المجاالت األخرى ولكن هدفنا هنا هو دورة
اساسيات للغة البايثون للمبتدئين وحتى المحترفين في مجال المعلوماتية وقد تعلمنا لحد االن الكثير من الطرق للبحث
عن بيانات معينة في سطر او ملف واستخالص ما نريد وطباعته او معالجته بطريقة معينة.
كل ما في االمر ان هناك طرق مختصرة أكثر وأسرع لتحقيق ما كنا نكتبه في 11او أكثر من االسطر البرمجية في
)programmingحين كانت البرمجة معقدة للغاية ومليئة بالرموز واالختصار لتقليل حجم البرامج وزمن تنفيذها حين
على كل حال ينصح خبراء البرمجة بتعلم هذه الطرق المختصرة للبرمجة لمن يريد الحرص على صغر البرامج وسرعة
تنفيذها وال داعي للقلق في حالة عدم فهمها فقد تعلمنا (وسنتعلم ان شاء هللا) طرق أكثر بساطة في تحقيق كل ما تحققه
األدوات التالية:
قبل استخد ام أي من هذه األدوات ال بد من استدعاء مكتبة خاصة بها ويتم ذلك بوضع عبارة ( )import reفي بداية
البرنامج.
61
-تعتبر التعابير القياسية لغة بحد ذاتها وتشترك الكثير من خصائصها مع العديد من لغات البرمجة األخرى.
-تسمى هذه اللغة الخاصة لغة برمجة رموز التأشير ( )marker charactersوهي أحد أدوات المدرسة القديمة
-تستطيع هذه التعابير استخدام دوال ()( )re.searchلمطابقة سالسل رمزية مع رموز معينة يتم إدخالها وهي
تشبه الى حد كبير دالة ()( )findاال انها أكثر كفاءة كما سنرى.
-تستطيع هذه التعابير استخدام دالة ()( )re.findallالستخالص جزء من سلسلة رمزية تطابق مدخالتنا وهي
واالن قبل الخوض في إعطاء امثلة للمقارنة بين شكل البرنامج عند استخدام التعابير القياسية وبدونها ،ال بد من شرح
االستخدام التعبير
كما في البحث يستخدم للداللة على ( )anythingألي عدد من الرموز من صفر الى أي عدد اخر. *
نفس الرمز السابق اال انه يسمى التكرار غير الطماع ( )non greedyأي انه يتوقف عند او مطابقة. ?*
62
مثل عمل ?* تماماً. ?+
مطابقة رمز واحد من هذه الرموز مع المدخالت المعطاة .يمكن وضع أي رمز هنا. ][abcd
مطابقة رمز واحد ليس في هذه القائمة وايضا ً يمكن وضع أي رمز هنا (حرف صغير او كبير او ][^abcd
هذه االقواس يمكن ان تحتوي مدى من الرموز بينها عالمة الشرطة ( )-وألي سلسلة من الرموز او ][0-9
][A-Z
اقواس البداية والنهاية لالستخالص حيث يتم ارجاع ما بداخلها فقط من ما ترجعه بقية األدوات من )(
واالن الى األمثلة حيث سنتناول مجموعة من األمثلة التي تحدثنا عنها في الدروس السابقة ولكن هذه المرة سنأخذها مرة
المثال األول:
البرنامج الى جهة اليسار هو ما تعلمناه سابقا ً من فتح (قراءة) ملف نصي ثم استخدام ( )forللتنقل بين اسطره وإلغاء
الفراغات الى يمين (نهاية) كل سطر ثم البحث عن االسطر التي تبدأ بكلمة ( )From:لطباعتها.
63
اما البرنامج الى اليمين فهو يقوم بالمثل بالضبط ولكن باستخدام التعابير القياسية حيث استخدمنا دالة ()( )re.search
وفي داخلها وضعنا ( )‘Form: ‘, lineوتعني ابحث باستخدام التعابير القياسية (التي لم نستخدم أي منها هنا!) عن أي
المثال الثاني:
هنا نفس البرنامج مع تحديد أكثر بالبحث عن السطر الذي يبدأ بكلمة ( Fromوليس أي كلمة ( )fromفي أي مكان
من السطر والبرنامج الى اليسار يفترض انه مفهوم واما البرنامج الى اليمين ففيه العبارة التالية التي تستحق الشرح:
حيث قلنا للمترجم هنا :اذا كانت نتيجة البحث عن (السطر الذي يبدأ (^) بعبارة ( ) )From:صحيحة (.)True
وهنا الحظنا كيف استخدمنا اول تعبير قياسي (^) للمقارنة ببداية السلسلة الرمزية.
المثال الثالث:
ذكرنا ان النقطة ( ).تعني مطابقة أي رمز وعالمة (*) تعني أي عدد من الرموز وعند اجتماعهما معا ً يعطيان البحث
64
وهنا معنى التركيبة الى اليمين قم بالبحث والمطابقة لكل سلسلة رمزية تبدأ (^) بحرف ( )Xكبير ثم بعده أي رمز ().
المثال الرابع:
السطر الثاني :تعريف لمتغير اسمه ( )countومنحه قيمة أولية مقدارها صفر.
السطر الثالث :تعريف لمتغير اسمه ( )aوهو عبارة عن سلسلة رمزية واضحة باللون األخضر.
السطر الرابع :عبارة ( )forللتنقل بين مكونات السلسلة الرمزية حيث يكون كل مجموعة رموز يفصل بينها وبين ما
قبلها وما بعدها فراغ كعنصر واحد من عناصر السلسلة الرمزية نسميها (.)word
65
السطر الخامس :شرط للبحث باستخدام التعابير القياسية نصه يقول :ابحث عن التراكيب التي تبدأ بحرف ( )Mكبير
وبعده مجموعة من الرموز في كل جزء ( )wordمن السلسلة ( )aوفي حالة كون الشرط صحيح سيتم تطبيق السطر
السادس.
السطر السابع :طباعة عبارة ( )count isثم عدد مرات تكرار ذلك التركيب الذي كنا نبحث عنه.
ناتج التنفيذ :ظهر لنا ان ناتج التنفيذ هو 3وهي الكلمات ( .)Mustafa, My, Mustafaوالتي يبدأ كل منها بحرف
مالحظة :بعض األحيان البيانات تكون غير مرتبة او ( )Cleanكما نتوقع فيجب ان نحسب حساب كل االحتماالت
ونضيق نطاق البحث باستخدام أدوات أخرى من ضمن التعابير القياسية وكما في المثال ادناه:
المثال الخامس:
هنا قمنا بنفس خطوات المثال أعاله غير اننا فقط اضفنا الى شرط المطابقة العبارة التالية:
66
ابحث عن الكلمات التي تبدأ بالحرف ( )Mثم أي مجموعة من الحروف ثم الرمز ( ):وهنا نجد ان المطابقة كانت رمزاً
واحداً فقط.
حيث قلنا للمفسر هنا :قم بمطابقة الكلمات (او السالسل الرمزية) التي تبدأ بالحرف الكبير ( )Xثم بعده مجموعة رموز
ليست فراغات ثم رمز ( ):ونرى في الجانب االيسر ان اول عبارتين طابقتا المطلوب ولكن العبارة الثالثة لم تعد مطابقة
67
التعابير القياسية 2
بعد ان تحدثنا عن مقدمة التعامل مع التعابير القياسية ( )Regular Expressionsومميزاتها وبعض األمثلة عنها في
الدرس السابق ،نأتي اليوم الى اكمال حديثنا عنها بشرح المزيد من األمثلة للمقارنة بين مميزات استخدامها والبرمجة
بدونها وكما كرنا سابقا ً يبقى خيار استخدامها او تركها للمبرمج مع التأكيد على أهميتها لتقليل حجم البرنامج وتسريع
هذا المثال يتكون من ثالث أسطر برمجية فقط في األول قمنا باستيراد مكتبة التعابير القياسية التي ال يمكن ان تعمل اال
باستيراد مكتبتها والسطر الثاني ادخال لقيمة المتغير ( )xواما السطر الثالث فهو تعريف للمتغير ( )yواسناد قيمة (او
قيم) له هي عبارة عن ناتج تنفيذ عبارة البحث ضمن المتغير ( )xعن أي سلسلة رقمية تحتوي األرقام من الصفر الى
68
المثال الثاني :استرجاع قيم رمزية لمجموعة حروف معينة فقط:
Zتقوم بإرجاع السالسل الرمزية التي تحتوي الحروف الصغيرة من aالى rعلما ً ان ال rمن ضمنها.
69
المثال الثالث:
هنا قلنا للمفسر قم بطباعة قيمة المتغير ( )yعلى انها أي سلسلة رمزية تبدأ بالحرف الكبير ( )Fثم بعده مجموعة رموز
وصوالً الى النقطتين ( ):ولكن ألن الرمزين ( +و *) يسميان أدوات المطابقة الطماعة ()greedy matching tools
فهما يقومان بالتعدي الى ابعد نقطة مطابقة لل شروط ولذلك لم تتوقف المطابقة عند اول نقطتين ( ):وانما تجاوزتها الى
هنا قمنا بكتابة نفس الكود البرمجي وكل ما غيرناه هو إضافة (?) الى التركيب القياسي لنجعله يتوقف عند اول نقطة
هنا قلنا للمفسر قم بالبحث عن الرمز (@) وقبله على األقل رمز واحد ليس فراغ ( )non-whitespaceوبعده على
األقل رمز واحد ليس فراغ ( )non-whitespaceوقم بوضعه داخل المتغير ( )yثم اطبعه.
المثال السادس :لزيادة التركيز أكثر في نتائج المطابقة نستخدم االقواس () والتي تحدد بداية ونهاية الجزء المراد
71
وهنا نالحظ ان ال ( )zعلى الرغم من انها تحتوي على الكثير من الرموز للمطابقة بداخلها اال ان ما ارجعته عبارة
الطباعة هو فقط ما كان محصوراً بين القوسين () وهو المطلوب لتضييق نطاق النتائج المرجعة.
المثال السابع:
72
المثال الثامن :البحث بطريقة التجزئة المزدوجة ( :)double splitوقد سبق التطرق الى هذه الطريقة وشرحها سابقا ً
المثال التاسع :لتطبيق نفس المطلوب في المثال السابق باستخدام التعابير القياسية:
73
المثال العاشر :خيارات أكثر للبحث والمطابقة:
74
الى هنا احبتي الكرام ينتهي الجزء الثاني من دورتنا المستمرة ان شاء هللا وقد تناولنا في هذه الدورة كل ما يتعلق بأدوات
االدخال واإلخراج واساسيات البرمجة بلغة بايثون ومعالجة البيانات الرقمية والنصية بكل الطرق الممكنة .سيكون
تركيزنا في األجزاء القادمة من هذه الدورة ان شاء هللا على البرمجة للتطبيقات التفاعلية ()interactive applications
للحاسوب والهواتف النقالة ان شاء هللا وربما نصل الى مرحلة البرمجة للتطبيقات الموزعة عبر االنترنت (الشبكات)
وبرمجة مواقع االنترنت بلغة بايثون فتابعوا معنا كل جديد على مدونة مصطفى صادق العلمية على الرابط التالي:
75