الدرس األول :مقدمة عامة قبل البدء في شرح اساسيات البرمجة بلغة بايثون دعونا نتصفح بعضا ً من مميزاتها ونوضح كل منها وكما يلي: ظهرت لغة بايثون ألول مرة عام 9191بعد اطالقها للبرمجة من قبل مخترعها الهولندي (غويدو فان روسوم) وتمتاز هذه اللغة بأنها تركز على قابلية القراءة ( )Readabilityباستخدامها لكلمات مفتاحية مشابهة للغة البشر تسهل قراءتها من قبل المختصين وغيرهم .كما تتميز هذه اللغة بسرعتها لكونها لغة مفسرة ( )interpretedأي انها تنفذ مباشرة بدون الحاجة الى ترجمة ( )not compiledوهي ايضا ً لغة نماذج أولية سريعة ( )rapid prototyping languageيمكن استخدامها لفحص النماذج األولية بدون الكثير من المقدمات واالعدادات المسبقة فهي ال تحتاج الكثير من الوقت للتطوير فهي اسرع من بقية لغات البرمجة األخرى مثل ال ( )C++, Java,…etc.كما ان من مميزاتها المرونة العالية في استخدام المتغيرات بدون اعالن ( )no variable declarationمما يقلل وقت البرمجة والتطوير الى الحد األدنى .كغيرها من لغات المستوى العالي، تمتاز لغة بايثون انها موجهة نحو الهدف ( )object orientedوهي لغة إجرائية ( )proceduralتسمح بتطوير تطبيقات متعددة األغراض ( )general purposeألدارة الذاكرة ( )memory managementوتطوير مكتبات النظام القياسية ( .)standard librariesيتوافر مفسر اللغة ( )language interpreterللتنصيب على مختلف نظم التشغيل من الويندوز والماك واللينكس ويمكن تنزيل النسخة المناسبة لكل نظام ( )/https://www.python.org/downloadsوالذي عند فتحه تظهر الواجهة التالية: 1 من الموقع التالي من هذه الواجهة نختار اإلصدار المناسب (ويفضل ان يكون األخير الحتوائه على اخر التحديثات) وهو االن (وقت كتابة الدرس) اإلصدار ( )python 3.4.3فننقر عليه لتظهر الواجهة التالية: 2 نجد هذه الملفات في أسفل صفحة ونقوم بتنزيل النسخة المناسبة لنظام تشغيلنا ( )32 or 64ونقوم بتنصيبها وهي سهلة التنصيب ال تحتاج أي معلومات مسبقة إلكمال تنصيبها. واالن بعد اكتمال التنصيب نذهب الى قائمة ( )Startونكتب في خانة البحث ( )idleلتظهر لنا ضمن النتائج ال ( IDLE )Python GUIفنقوم بفتحها لتظهر الواجهة التالية: وهذه الواجهة تمثل الواجهة الرسومية لتطوير وتطبيق برامجنا التي سنعمل عليها في هذا الدرس والدروس القادمة ان شاء هللا تعالى. االن ننتقل الى الخطوة المهمة األخرى وهي ضبط بيئة الويندوز للعمل على البايثون خارج ال ( )IDLEالخاص به في سطر األوامر ( )Command Promptاو غيرها ويتم ذلك بالنقر نقرة يمين على ايقونة جهاز الكومبيوتر ثم الذهاب الى propertiesثم ( )advanced system settingsلتظهر النافذة التالية: 3 االن ننقر على ( )environment variablesلتظهر النافذة التالية: 4 االن نذهب الى ( )system variablesوننقر على ( )newلتظهر الواجهة التالية والتي نمألها بالمعلومات المبينة في ادناه: وهنا قمنا بتعريف متغير جديد للويندوز اسمه ( )pythonوامتداده هو امتداد تنصيب المفسر الذي قمنا بتنزيله وتنصيبه قبل قليل وهو في الوضع الطبيعي (.)c:\python34 بعدها ننقر على ( )okوبذلك تنتهي عملية تهيئة بيئة الويندوز للتعامل مع البايثون في التطبيقات المختلفة. 5 الدرس الثاني برنامج (:)hello world بعد ان شرحنا كيفية تنزيل وتنصيب البرمجيات الالزمة للبدء بالعمل على لغة بايثون في الدرس السابق ،وشرحنا ايضا ً كيفية اعداد بيئة نظام تشغيل الويندوز للتعامل مع هذه اللغة .نأتي اليوم الى البدء بالتعامل مع هذه اللغة وكيفية كتابة اول برنامج باستخدامها ولكن قبل ذلك ال بد من ذكر مالحظة مهمة جداً وهي اننا اعتمدنا في شرحنا لهذه الدروس على تطبيق ( IDLE )Python GUIولكن هناك الكثير من التطبيقات األخرى التي يمكن استخدامها لكتابة برامج بايثون واختبار أدائها وتطويرها ومن أهمها هو ( )Notepad ++والذي يمكن تنزيله من الرابط التالي /https://notepad-plus-plus.org :ورغم اننا لن نتعامل معه في شروحاتنا اال انه من األفضل ذكره لمن احترفوا استخدامه في تطوير برمجيات بقية لغات البرمجة سابقا ً او يحاولون التعامل معه االن بدءاً من لغة بايثون علما ً انه يتمتع بمميزات اكثر بكثير من مفسر بايثون التلقائي الذي قمنا بتنصيبه في الدرس السابق وهو ( )IDLEالذي سنعمل عليه في دورتنا هذه. االن نبدأ درسنا على بركة هللا: نذهب الى قائمة ( )Startونقوم بفتح تطبيق ( )IDLE Python GUIالذي قمنا بتنصيبه سابقا ً لتظهر النافذة التالية: االن نرى محرك األوامر (>>>) وهو محرك األوامر الخاص بلغة البايثون ويعني اننا مستعدون للبدء بكتابة برنامجنا األول والذي سيكون كما في كل لغات البرمجة لطباعة عبارة ( )hello worldعلى الشاشة والذي يتكون في لغة بايثون من سطر واحد فقط على خالف بقية لغات البرمجة األخرى مثل السي بلس بلس والجافا واليكم مقارنة بسيطة بينها بخصوص هذا البرنامج: 6 مالحظة :الصورة أعاله تحتوي خطأ حيث تم استخدام ( )printللغة بايثون بدون اقواس وهو الحال للبايثون 7،2وما قبلها واما بايثون 3وما بعدها فتتطلب االقواس بشك ضروري لذا يجب االنتباه الى النسخة التي تستخدمها وفروقات متطلباتها. وكما الحظنا هنا فأن طباعة عبارة ( )Hello worldتتطلب سطراً واحداً فقط وهو (”print (“hello world والذي يتضح في مفسر اللغة كما يلي: 7 االن عرفنا كيفية طباعة سطر واحد من الكلمات ويمكن طبعا ً طباعة أكثر من سطر وذلك بتكرار عبارة ( )Printوكما في ادناه: االن قد يتساءل البعض عن كيفية طباعة عدة أسطر دفعة واحدة او تنفيذ مجموعة من األوامر دفعة واحدة (كما هو الحال في بقية لغات البرمجة) والحل لذلك سهل جداً وهو سياقنا الذي سنتبعه في الشرح للدروس القادمة: 8 نبدأ خطوات ذلك االن: نقوم بالنقر على مكان فارغ في سطح المكتب نقرة يمين ثم نختار ( )newثم ( )text documentونسمي الملف باسم معين ونغير امتداده الى ( ).pyوهو امتداد ملفات البايثون وكما في ادناه: ولمن ال يعرف كيفية عرض امتدادات الملفات فهو امر سهل جداً: نفتح ( )my computerثم نذهب الى قائمة ( )toolsومنها نختار ( )folder optionsثم ( )viewلتظهر النافذة التالية: االن نقوم بإزالة عالمة الصح (ان كانت موجودة) من المربع امام خيار ()Hide extensions for known file types ثم ( ) okوبعدها سنالحظ ان كل الملفات في الحاسوب ستظهر مع امتداداتها مما يسمح لنا بتغيير امتداد أي ملف بحسب 9 الحاجة وهو ما فعلناه هنا حيث غيرنا امتداد الملف النصي ( ).txtالى ملف بايثون ( ).pyوالذي عند فعله تظهر رسالة تطلب منا تأكيد ذلك فنفعل ليكون شكل الملف النهائي كما في ادناه: االن نقوم بالنقر نقرة يمين على هذا الملف واختيار ( )edit with idleلتفتح النافذة التالية: االن نكتب أي عدد من أوامر البايثون هنا وألننا لحد االن ال نعرف سوى ايعاز الطباعة ( )printفسنكتب التالي: 10 طبعا ً يمكن كتابة المزيد ولكننا هنا نحاول إعطاء مثال فقط واالن لتنفيذ كل هذه االيعازات دفعة واحدة نقوم بالذهاب الى قائمة ( )runثم اختيار ( )run module F5لتظهر نتيجة التنفيذ التالية: هنا يطلب منا حفظ الملف ( )saveحيث تتميز ملفات البايثون بعدم القابلية للتنفيذ بدون حفظ فننقر على ( )okليتم حفظ تغييرات الملف وتنفيذه فيما بعد لتظهر النتائج التالية: 11 وهنا نرى ان النتائج جاءت بتنفيذ كل أسطر األوامر دفعة واحدة كما هو الحال في برامجنا االعتيادية في بقية لغات البرمجة. 12 الدرس الثالث (:)Input tools بعد ان شرحنا بيئة العمل في البايثون وبعض أدوات اإلخراج ( )printفي الدروس السابقة نأتي اليوم لنشرح أحد أدوات االدخال وهي أداة ( )inputوالتي يمكن استخدامها بالطريقة التالية: للبايثون 3وما بعدها للبايثون 7،2وما قبلها )”x= input ("enter your name )“ x=raw_input(“enter something وكما تالحظون فأن االدخال هنا يتم اسناده مباشرة الى متغير اسمه على سبيل المثال ( )xويمكن استخدام أي اسم اخر طبعا ً وبنفس شروط التسمية في بقية لغات البرمجة األخرى مثل ان يحتوي االسم على أي تركيبة من الحروف واألرقام بشرط ان ال يبدأ برقم وان ال يحتوي عالمة ( )underscoreوهي (_) وبقية الشروط المعروفة لكل المبرمجين. كذلك من األمور التي يجب مالحظتها هنا وهي فرق رئيسي بين لغة بايثون وبقية اللغات انها ال تحتاج تعريف المتغير قبل استخدامه أي اننا نستطيع اسناد أي قيمة الى المتغير ( )xكمثال واستخدامها واليكم المثال التالي: نقوم بفتح ال ( )idle python GUIونكتب التالي: من هنا نالحظ األمور التالية: -9إمكانية اسناد أي قيمة الى أي متغير مباشرة وبدون اعالن مسبق عن نوع المتغير. 13 -7إمكانية اجراء العمليات الحسابية مباشرة وبدون مقدمات وال استدعاء لمكتبات الرياضيات او غيرها كما في بقية لغات البرمجة األخرى. -3طباعة قيمة أي متغير باستخدام ايعاز ( )printفي أي مكان من البرنامج. -4يمكن اسناد قيم جديدة للمتغير والذي يأخذ دائما ً اخر قيمة أسندت له وينسى القيم القديمة فمثالً ال ( )xكانت قيمته األولية 9ثم وضعنا بداخله (أسندنا له) قيمة رمزية هي (” )“hello worldوحين طلبنا طباعة قيمته باإليعاز ) print(xقام المفسر بطباعة قيمة المتغير النهائية. -5يمكن طباعة قيمة أي متغير بذكر اسمه فقط ومثال ذلك حين كتبنا ( )xقام المفسر بطباعة قيمته مباشرة وبدون الحاجة الى ايعاز ( )printوهي خاصية مهمة جداً سنتعرف على أهميتها في الدروس القادمة ان شاء هللا. واالن نعود الى أداة االدخال موضوع الدرس ونكتب الكود التالي في ملف ( ).pyكما فعلنا في الدروس السابقة وكما في ادناه: االن نقوم بتنفيذ هذا الكود لنرى النتيجة: 14 هنا نرى ان المفسر قام بطباعة العبارة داخل ايعاز االدخال ( )inputمنتظراً منا ادخال قيمة معينة ليقوم بأسنادها الى المتغير ( )xفنقوم بكتابة أي شيء وننقر ( )enterلنرى النتيجة: هنا قمنا بإدخال قيمة المتغير ( )xوهي كلمة ( )mustafaفقام المفسر بأسنادها الى المتغير xثم طباعتها استناداً الى االيعاز الثاني printواليكم مجموعة ايعازات أكثر توضيحا ً للفكرة: 15 واالن عند تنفيذ هذا البرنامج نجد النتائج التالية: ولتوضيح البرنامج أعاله نقول: االيعاز األول لعرض رسالة للمستخدم تطلب منه ادخال قيمة معينة ليتم اسنادها الى المتغير xكسلسلة رمزية (.)String االيعاز الثاني لطباعة قيمة المتغير x االيعاز الثالث لعرض رسالة للمستخدم تطلب منه ادخال قيمة معينة ليتم اسنادها الى المتغير yكسلسلة رمزية (.)String االيعاز الرابع لعرض رسالة للمستخدم تطلب منه ادخال قيمة معينة ليتم اسنادها الى المتغير zكسلسلة رمزية (.)String 16 االيعاز الخامس هو أداة تحويل للسلسلة الرمزية المخزونة في ( )yالى رقم صحيح ( )integerليخزن في المتغير .y1 االيعاز الخامس هو أداة تحويل للسلسلة الرمزية المخزونة في ( )zالى رقم صحيح ( )integerليخزن في المتغير .z1 االيعاز السابع هو عملية رياضية لحساب معدل القيمتين التي تم ادخالهما ووضع الناتج في متغير يسمى avg واخيراً االيعاز الثامن لطباعة قيمة الناتج (المعدل) المسمى ( )Avgوهذا ما حصل في التنفيذ كما هو واضح أعاله. مالحظة :للخروج من برنامج ( )IDLE Python GUIيمكن فقط كتابة )( exitفي سطر األوامر او النقر ()Ctrl + C سوية من لوحة المفاتيح .اما محرر النصوص الذي قمنا بالكتابة بداخلة من البداية فيجب الحرص على خزن التغييرات فيه قبل التنفيذ وقبل اغالقه تجنبا ً لضياع الشفرات البرمجية التي قمنا بكتابتها. مالحظة أخرى :عالمات االقتباس المفردة (’‘) وعالمات االقتباس المزدوجة (”“) تستخدمان داخل ايعازات االدخال input واإلخراج printبنفس الطريقة بدون أي فرق بينهما. مثال اخر للتوضيح أكثر: وعند التنفيذ تظهر النتائج التالية: 17 وايضا ً لتوضيح البرنامج نذكر التالي: االسطر الثالثة األولى هي مجرد ادخال لثالث قيم وخزنها في متغيرات تسمى x,y,zكما سبق شرحه. االسطر الرابع والخامس والسادس هي لتحويل قيم تلك المتغيرات من سالسل رمزية ( )stringالى قيم صحيحة (.)int السطر السابع لحساب المعدل فقط كما تم توضيحه سابقا ً السطر األخير لطباعة عبارة اإلخراج للمستخدمين والتي تحتوي الكثير من األمور منها رسائل للمستخدم ال يتم تفسيرها من قبل المفسر ( ) interpreterوقد وضعت بين عالمتي اقتباس (مفردة او مزدوجة فال فرق بينهما) واما بقية األمور التي فصل ت بينها وبين الرسائل الغير مفسرة فوارز متعددة فهي قيم رياضية او منطقية او رمزية ليتم طباعة قيمها على شاشة اإلخراج. مالحظة أخيرة: االن وبعد ان اكملنا العمل على هذا البرنامج ،نستطيع اغالقه واغالق مفسر البايثون ( )idle python guiثم النقر نقرتين على ملف البرنامج الذي قمنا بخزنة في البداية تحت اسم ( )*.pyلنرى النتيجة التالية: 18 مما يعني ان برنامجنا الذي قمنا بكتابته وحفظه قد أصبح ملف قابل للتنفيذ بعيداً عن اللغة ومفسرها أي اننا نستطيع وضع أي شفرة برمجية بداخله وحفظه ليتم تنفيذه بشكل مباشر فيما بعد وهو أحد المميزات الممتازة للغة البايثون مقارنة ببقية لغات البرمجة األخرى التي يتطلب انشاء ملف تنفيذي فيها خطوات كثيرة. 19 الدرس الرابع :التعليقات والتعامل مع األرقام ()comments and numbers بداية وككل لغات البرمجة تحتوي لغة البايثون على أدوات إلضافة تعليقات ( )commentsفي داخل البرنامج والتي ال يقوم المفسر بتفسيرها وال حتى عرضها عند التنفيذ بل هي تستخدم فقط لترك مالحظات وتعليقات للمبرمج نفسه او لبقية المبرمجين المسؤولين عن تدقيق او تطوير البرنامج في المستقبل وهذه التعليقات في لغة البايثون هي ببساطة كل ما يأتي بعد عالمة ( )#وكما في المثال ادناه: نفتح ال ( )IDLE python GUIكما تعلمنا سابقا ً ونكتب التالي ونرى نتيجة التنفيذ هنا رأينا كيف ان الكلمات التي بعد العالمة ( )#لم يتم اخذها بعين االعتبار عند التنفيذ فالمفسر ال ينظر اليها اصالً وهي للمبرمج فقط وليس للمستخدمين وهي ذات أهمية كبيرة للمبرمجين خصوصا ً للبرامج الكبيرة والمتشعبة. االن ننتقل الى الجزء الثاني من درسنا اليوم وهو كيفية التعامل مع األرقام في البايثون: استخدام البايثون كألة حاسبة:نستطيع استخدام محرك األوامر في مفسر البايثون كألة حاسبة مباشرة وكما يلي: 20 كما نرى فقد تم تنفيذ كل االيعازات بمجرد النقر على ( )enterبعرض نتائج العمليات الرياضية مباشرة مع عدم اهمال أي كسور عشرية. كذلك من مميزات هذه اللغة عن بقية لغات البرمجة األخرى قابلية االسناد المتعدد وكما في ادناه: ويعلم مبرمجي لغات الجافا والسي بلس بلس ان هذا غير مقبول في تلك اللغات مما يميز لغة بايثون عنها في هذا المجال. كذلك يمكن التعامل مع االعداد المركبة وهي االعداد التي تتكون من جزئين حقيقي وتخيلي ( )x+jyحيث يمثل ال ( )jقيمة غير حقيقية تمثل جذر السالب واحد وكما في ادناه: 21 ومن األمثلة أعاله نالحظ اننا نستطيع التعبير عن االعداد المركبة بعدة طرق واجراء كل العمليات الرياضية عليها بسهولة. كذلك يمكن التعامل مع أجزاء االعداد المركبة الحقيقي ( )Realوالتخيلي ( )imaginaryوكما في ادناه: 22 ومن هنا نرى اننا نستطيع تسميه العدد التخيلي باسم معين ثم التعامل مع جزئه الحقيقي والتخيلي كل على حدة. وكما عرفنا من الدروس السابقة فهناك عدة دوال للتحويل بين األنواع المختلفة لألعداد ومنها ()( )int(), floatوكما في ادناه: 23 من هنا نرى اننا نستطيع تحويل االعداد الصحيحة الى عشرية وبالعكس اال ان هذا ال يمكن مع االعداد المركبة وكما في ادناه: حيث نرى رسالة الخطأ واضحة بعدم قابلية تحويل االعداد المركبة الى اعداد عشرية ولكننا نستطيع إيجاد القيمة المطلقة للعدد المركب وهي الجذر التربيعي لناتج جمع الجزء الحقيقي تربيع مع الجزء التخيلي تربيع وكما في ادناه: ))Abs(a)=sqrt((a.real*a.real)+(a.imag*a.imag وكما في ادناه: 24 مالحظة أخرى :عند التعامل مع المفسر كحاسبة ألجراء العمليات الحسابية فأن اخر نتيجة او رقم يتم طباعته يتم حفظه في متغير خاص داخل المفسر اسمه (_) بحيث يمكن التعامل معه على انه متغير يدخل في عمليات حسابية أخرى وكما في ادناه: وكما نرى هنا فقد تم التعامل مع المتغير (_) على انه قيمة عددية تدخل في الحسابات وحين قمنا بطرحه من نفسه وكان الناتج صفر ،تم خزن الصفر في نفس المتغير وحين حاولنا القسمة عليه ظهر خطأ عدم قابلية القسمة على صفر. 25 الدرس الخامس :التعامل مع السالسل الرمزية ()Strings بعد ان شرحنا أدوات االدخال واإلخراج والتعليقات واألرقام نأتي اليوم الى كيفية التعامل مع السالسل الرمزية وهي ببساطة أي تركيبة من الحروف واألرقام والرموز الخاصة ويتم ببساطة إدخالها الى المفسر محصورة بين عالمات اقتباس مفردة (‘ ‘) او عالمات اقتباس مزدوجة (" ") وكما في المثال ادناه: وكما نرى هنا فأن أي شيء محصور بعالمات اقتباس يتم طباعته بدون تصرف من المفسر وكذلك فأن اسناد هذه السالسل الرمزية الى متغيرات وطباعتها مرفقة مع بعضها البعض يتم باستخدام عالمة ( )+والتي تمثل هنا عالمة ارفاق ( )appendingوليست جمع حيث يتم طباعة المتغير األول ثم الثاني وهاكم مثاالً اخر لتوضيح الفكرة: 26 هنا نالحظ الفرق بين االدخال المباشر وبين االدخال عن طريق أداة ( )inputففي المرة األولى تعامل المفسر مع ال( )xوال ( ) yعلى انها متغيرات رقمية وفي المرة الثانية عاملها على انها سالسل رمزية والتي يمكن تحويلها الى ارقام باستخدام الدالة التي تحدثنا عنها سابقا ً () )int(xويمكن مراجعة الدروس السابقة لالطالع عليها. كذلك فأن السالسل الرمزية يمكن ان تمتد ألكثر من سطر واحد كما هو الحال في بقية لغات البرمجة األخرى وباستخدام (\)\n كما في المثال ادناه: 27 كذلك يمكن ان تتكون السلسلة الرمزية من مجموعة سالسل رمزية جزئية وكما في ادناه: الحظ ايضا ً األمثلة ادناه: 28 االن وكما في لغة ( ) Cمن المهم التعامل مع مكونات السلسلة الرمزية (الرموز) كل على حدة لتغيير او تعديل أي شيء فيها ويتم ذلك بفهرسة ( )indexالسلسلة الرمزية وهو شيء يحصل تلقائيا ً من قبل المفسر بحيث يكون الرمز األول ذو فهرس صفر والعنصر الثاني ذو فهرس 9وهكذا وكما موضح في األمثلة ادناه: 29 واالن دعونا نشرح كل سطر على حدة: السطر األول كان إلدخال قيمة سلسلة رمزية اسمها ( )stringومحتوياتها ()hello السطر الثاني ] string[0يستخدم لطلب طباعة الرمز األول من السلسلة ()string السطر الثالث يستخدم لطلب طباعة الرمز الثاني من السلسلة ()string السطر الرابع ] string[5يطلب طباعة الرمز السادس من السلسلة وألن السلسلة تتكون من 5رموز فقط فقد حصلنا على رسالة خطأ. السطر الخامس يطلب طباعة الرموز من 7الى 4مع عدم شمول الرمز الرابع فقام بطباعة الرمزين الثاني والثالث فقط السطر السادس يطلب طباعة الرموز من 7الى 5مع عدم شمول الرمز الخامس (الغير موجود اصالً) فقام بطباعة الرموز الثاني والثالث والرابع. السطر السابع ] string[:3يطلب طباعة كل شيء قبل الرمز الرابع (الذي فهرسه )3 السطر األخير ] string[3:يطلب طباعة الرمز الرابع (ذو الفهرس )3وما بعده. وهكذا نستطيع تعميم كل هذه المعلومات على بقية السالسل الرمزية األخرى. مالحظة :على خالف بقية لغات البرمجة فأن لغة بايثون ال تتقبل تغيير قيم رموز داخل السالسل الرمزية وكما موضح في المثال ادناه: 30 كذلك يمكن انتاج سالسل رمزية جديدة باستخدام الخصائص أعاله وكما في المثال التالي: 31 مزيد من األمثلة على التعامل مع أجزاء السالسل الرمزية: 32 واخيراً نذكر اننا حين نكتب قيم فهارس سالبة فأننا بذلك نخبر المفسر بأن يبدأ الحساب من اليمين الى اليسار أي ان الفهرس سالب واحد يعني اخر رمز في السلسلة والفهرس سالب 7هو الرمز قبل األخير وهكذا وكما في ادناه: 33 واخيراً يجب الحذر عند التعامل مع فهارس السالسل الرمزية من اليمين واليسار ومالحظة الترقيم الصحيح لكل اتجاه. كما في كل لغات البرمجة األخرى ،فأن لغة البايثون توفر دالة حساب طول السلسلة الرمزية وهي ) len(stringوكما في ادناه: 34 الدرس السادس :الثوابت والمتغيرات ()Constants and variables قبل البدء بمحتوى درس اليوم هناك مجموعة من المالحظات التي يجب االنتباه لها: -9اننا في هذه الدروس نعمل بشكل متبادل على لغات البايثون 7والبايثون 3ورغم التشابه الكبير بينهما اال ان هناك اختالفات جوهرية بين تراكيب الجمل البرمجية الخاصة بكل منهما لذا يجب االنتباه الى أي منهما قمتم بتنصيبها وهو السبب في ظهور بعض رسائل الخطأ للبرامج التي نكتبها هنا. -7مما ال شك فيه ان كل هذه الدروس ستكون بدون فائدة من دون تطبيق لكل خطوة نشرحها والسؤال عن كل شيء غير مفهوم بل والتفكير اإلبداعي فيما وراء المشروح ومحاولة تجربة كل ما يخطر ببالكم وبأبسط األدوات بالتدريج فهكذا يتكون العقل البرمجي لديكم بالتجربة والخطأ الى حد الوصول الى مرحلة التمرس فالبرمجة هي لغة الممكن كالسياسة تماما ً . -3سيتم تطبيق بعض البرامج في بيئة الدوز في الويندوز ( )command promptفي حين سيتم تطبيق البرامج األكبر واألكثر تعقيداً كما شرحنا باستخدام برنامج ( )IDLE Python GUIلذا يرجى مالحظة الفرق بينهما عند التنفيذ. -4اعود وأؤكد على أهمية المتابعة والتطبيق والسؤال عن كل ما هو غير مفهوم ونحن هنا ننتظر اسئلتكم لتوضيح ما نحتاج اضافته الى المادة العلمية التي ننشرها لتعميم الفائدة وعدم الوقوع في نفس األخطاء مرة بعد أخرى. واالن نبدأ درس اليوم وبعد ان شرحنا أدوات االدخال واإلخراج والتعليقات وبعض األمور األخرى في الدروس السابقة وقبل البدء بشرح أدوات الشروط والتكرار ،نود ان نذكر المعلومات البديهية (للمبرمجين القدامى والمحترفين) التالية: الثوابت في لغة بايثون: وهي على نوعين: ثوابت رقمية مثل ( )11, 22.4, -45وهي األرقام الصحيحة والكسرية الموجبة والسالبة التي يمكن إدخالها مباشرة بأسنادها الى متغيرات او عن طريق لوحة المفاتيح باستخدام أدوات االدخال ( )inputوغيرها. الثوابت النصية او السالسل الرمزية مثل (” )“hello worldوالتي يتم إدخالها محصورة بين عالمتي اقتباس مفردة او مزدوجة وكما رأينا في الدروس السابقة. بعض األمثلة على ادخال الثوابت في بايثون: 35 المتغيرات في لغة البايثون: وهي األسماء التي تطلق على مواقع خزن البيانات في الذاكرة حيث يستطيع المبرمج خزن واسترجاع البيانات بداخلها ويستطيع المبرمج تحديد اسم المتغير وكذلك تحديد نوعية محتوياته (بدون تصريح مسبق) على خالف بقية لغات البرمجة األخرى. امثلة استخدام المتغيرات في لغة البايثون: شروط تسمية المتغيرات :كل لغات البرمجة فيها شروط معينة لتسمية المتغيرات وهي تقريبا ً متشابهة في كل لغات البرمجة وتسمل التالي: يجب ان يبدأ اسم المتغير بحرف او عالمة (_ .)underscore يجب ان يحتوي حروف وأرقام ورمز (_ )underscoreفقط وال يحتوي أي رموز خاصة أخرى36 يجب االنتباه الى ان لغة بايثون حساسة لحالة الحروف ( )case sensitiveأي ان المتغير الذي اسمه ( )Aliيختلفعن المتغير الذي اسمه ( )ALIوكذلك عن المتغير ( )aliفيجب االنتباه. يفضل ان تكون أسماء المتغيرات قريبة من معانيها الحقيقية لتسهيل قراءة البرنامج من قبل مبرمجه وغيره منالمبرمجين وفي حالة كثرة المتغيرات وتشابهها يفضل استخدام التعليقات ( )commentsلتوضيح معانيها. امثلة على أسماء المتغيرات المقبولة وغير المقبولة: مقبول_saad : سيءAlaa : Qasim22 ali ALAA غير مقبول 123all :ألنه يبدأ برقم. o1k2j3 alaaألنها متشابهة وتسبب مشاكل للمبرمجين * :Aliألنه يحتوي رمز خاص (*) وهكذا. -الشرط األخير ألسماء المتغيرات ان ال تكون أحد الكلمات المحجوزة للغة وهي التالية: تتكون برامج البايثون بصورة عامة من أسطر برمجية وتختلف أنواع هذه االسطر البرمجية باختالف مكوناتها وهي كما يلي: 37 حيث تكون بعض الجمل البرمجية هي عبارات اسناد فقط مثل ( )x=2وبعضها تكون جمل اسناد وتعابير رياضية مثل ( )y=x+2وبعضها عبارات ادخال او طباعة او شروط او تكرار وكما سنرى في الدروس القادمة ان شاء هللا. العمليات الرياضية األساسية للغة البايثون: امثلة على تطبيق العمليات الرياضية في بايثون: 38 تسلسل تنفيذ العمليات في لغة بايثون :كما في كل لغات البرمجة األخرى: االقواس األسس الظرب والقسمة الجمع والطرح من اليسار الى اليمينمثال: 39 مالحظة :لتبسيط األمور على المفسر والقاري فيما بعد يفضل فصل كل العمليات ذات األولوية المهمة بأقواس عن بقية أجزاء العمليات الرياضية. مالحظة أخرى :القسمة في البايثون 7معقدة قليالً بحيث ان ناتج قسمة عدد صحيح على عدد صحيح اخر هو عدد صحيح مع اهمال الكسور العشرية ولكن هذا الشيء اختلف االن مع البايثون 3حيث أصبح المفسر ال يهمل أي جزء من الناتج ويعرضه كامالً حتى لو كانت القيم االصلية صحيحة وكما في ادناه: في البايثون 7 40 اما في البايثون 3 في لغة البايثون 7كانت عملية قسمة عدد صحيح على عدد عشري او بالعكس تعطي ناتج عشري دائما ً وهو امر مماثل لما يحصل االن في لغة بايثون 3التي عالجت المشكلة من األساس. أنواع المتغيرات والثوابت (:)Types of constants and variables 41 بعض األحيان نواجه مشاكل في التعامل مع المتغيرات والثوابت وتظهر لنا رسائل خطأ كثيرة بسبب محاولة اجراء بعض العمليات الحسابية البسيطة بين الثوابت والمتغيرات من (أنواع) مختلفة وكما في ادناه: والسبب في الخطأ األول هو محاولتنا جمع عدد صحيح مع سلسلة رمزية وهو خطأ بديهي طبعاً. اما السبب للخطأ الثاني فعلى الرغم من اننا قمنا بإدخال رقم ( )x=55ومحاولة جمعه مع رقم اخر وهو ( )y=5اال ان رسالة خطأ قد ظهرت ألن ادخاالت أداة ( )inputكلها تعتبر سالسل رمزية ولمعرفة نوع كل متغير نقوم بكتابة: )Type (variable name وكما في ادناه: 42 ومن هنا عرفنا ما هو نوع كل متغير او ثابت بوضعه بين قوسين وسبق ذلك بكلمة typeوالتي تساعد في حل مشاكل األنواع واما التحويل بين األنواع فقد تحدثنا عن بعضه سابقا ً وذلك بتحويل السلسلة الرمزية الى عدد صحيح باستخدام دالة: )int(variable name or value ويمكن استخدام دالة التحويل الى عدد عشري باستخدام: )float(variable name or value وكما في ادناه: 43 44 الدرس السابع :الجمل الشرطية ()conditional statements كما في كل لغات البرمجة ،فأن لغة بايثون تتعامل مع الشروط بشكل ممتاز وباستخدام عبارة ( )ifوبالصيغة التالية: If condition: Statements Or: If condition: Statements Else: Statements وكما يعرف الجميع فأن العبارات ( )statementsال تنفذ اال إذا كان الشرط ( )conditionصحيحا ً واما إذا كان الشرط خطأ فيتم القفز مباشرة الى العبارات بعد بلوك ال ( )ifوكما في التوضيح التالي: وكمثال على ذلك الحظوا البرنامج التالي: 45 ونالحظ هنا ان الشرط بجانب ال ( )ifوهو ( )x>3صحيح فتم تنفيذ كل العبارات داخل بلوك ال ( )ifواما لتمييز العبارات التابعة لل ( )ifفبخالف لغات البرمجة األخرى ،ال تستخدم بايثون االقواس وانما المسافات ( )indentsلتمييز العبارات التابعة لل ( )ifولغيرها من عبارات الشروط والتكرار التي سنتحدث عنها الحقاً .واما ألنهاء بلوك ال( )ifاو ال ( )elseاو أي شيء غيرها فنقوم فقط بإرجاع مؤشر الطباعة الى بداية السطر او بمحاذاة الدالة السابقة لنعطي للبايثون رسالة تفيد بأن البلوك الحالي انتهى .وقبل الخوض في بقية تفاصيل استخدام عبارة ( )ifال بد من التذكير بعبارات المقارنة المنطقية التي يمكن استخدامها مع عبارة ( )ifوهي كما يلي: 46 وكمثال لدور المسافات ( )indentsفي التفريق بين بلوك واخر الحظ الصورة التالية: حيث نالحظ ان كل لون مختلف هو بلوك يتميز عن بقية البلوكات وبعضها يجتمع بسطر واحد وبعضها بعدة أسطر. كما يعرف المبرمجون ببقية لغات البرمجة ،فأن عبارة ( )ifتحتوي الكثير من الخيارات والمميزات ومنها انها يمكن ان تستخدم في التنفيذ بمسار واحد او بعدة مسارات وبحسب نوعية استخدامها وكما في التفصيل ادناه: 47 حيث يتضح من المثال أعاله ان هناك شرط واحد للتنفيذ اما ان يكون صحيح فيتم التنفيذ واما ان يكون خطأ فيقفز المفسر الى ما بعد بلوك ( )ifلتنفيذه. مالحظة :كما ذكرنا سابقا ً فأن المسافات ( )indentsتعمل بدل االقواس لفصل بلوك ( )ifعن بقية مكونات البرنامج وهنا يجب االنتباه الى استخدام زر ( )spaceمن لوحة المفاتيح أربع مرات واالبتعاد كليا ً عن استخدام ( )tabألنه يعطي رسالة خطأ دوما ً حيث يعتبر ال ( )tabرمزاً غير مفهوم للغة بايثون فيجب الحذر. ولمزيد من التوضيح حول المسافات ودورها في تحديد مسار التنفيذ الحظ األمثلة التالية: 48 ولتوضيح البلوكات المتداخلة نضعها بألوان مختلفة هنا: 49 الحظ عدم وجود اقواس وانما مسافات فقط. 50 كما في الصورة السابقة نرى ان عبارة ( )ifتستخدم بشكل متشعب ( ifبداخل ) ifوتسمى باصطالح البرمجة ()nested if وتعني انه ان كان الشرط األول صحيح فقم بالدخول الى البلوك الخاص به لتجد شرطا ً اخر ،فأن كان هذا الشرط صحيح ايضا ً يقوم المفسر بالدخول الى داخل البلوك الخاص به واال فال .وهكذا؟ يمكن في هذه الحاالت استخدام ( )elseاو ( )elif = else ifوبحسب الحاجة وكما في ادناه: 51 ويمكن ان يكون التنفيذ متعدد المسارات وكما في ادناه: ويمكن تنفيذ الكود أعاله بعدة طرق اعتماداً على قيمة ( )xوكما في ادناه: حيث ينفذ الجزء البرتقالي فقط ألن قيمة ( )xتساوي صفر. 52 وهنا تنفذ األجزاء البرتقالية ألن قيمة ( )xتساوي 5 واخيراً لقيمة ( )xتساوي 72نرى التنفيذ التالي: 53 الحظ ايضاً: واخيراً يمكن كتابة كودات برامج تحتوي على أسطر ال تنفذ ابداً وكما في الصورة التالية: 54 الدرس الثامن :أدوات الشرط واالستثناء ()Try-except statement بعد ان درسنا في الدرس السابق هيكل واستخدام األنواع المختلفة لعبارة ( )ifالشرطية ،نأتي اليوم لمناقشة مشكلة تحصل بكثرة اثناء استخدام أدوات االدخال للمتغيرات والثوابت وهي احتمالية ادخال المستخدم لقيمة ال تطابق شروط البرنامج او ما يتوقعه المبرمج فيسبب ذلك خطأ في التنفيذ عادة ولكن وجود أداة ( )try-exceptيسمح بتالفي هذه المشاكل وكما في التوضيح التالي: Try هنا نضع الكود الخطر او المحتمل ان يسبب فشل تنفيذ البرنامج Except هنا نضع حل االشكال المحتمل وكما سنرى في المثال التالي: نفترض اننا نريد المستخدم ان يدخل قيمة رقمية ( )integer or floatألدخالها في معادالت رياضية ولكنه يصدف ان يقوم المستخدم بأدخال قيمة متغير رمزي ( )stringمما يسبب توقف التنفيذ وظهور رسالة خطأ وكما في ادناه: وهنا نرى انه من الطبيعي ان تظهر هذه الرسالة ألننا حاولنا تحويل قيمة رمزية الى عدد صحيح وهو شيء غير مقبول برمجياً .ولتجنب هذه المشكلة نقوم بالتالي: 55 وهنا قمنا بأخبار المفسر بالقيام بالتالي: ان يقوم بأخذ قيمة المتغير ( )xعلى انها ” “firstوالمتغير ( )yعلى انها ” “secondثم قلنا للمفسر حاول ( )tryتحويل المتغيرين ( )x,yالى قيم صحيحة ،فأن كان ذلك ممكنا ً فسيقوم بتنفيذ ما بداخل عبارة ( )tryواال فسيقفز مباشرة الى ما بداخل عبارة االستثناء ( )exceptلينفذ ما بداخلها وهو ما حصل أعاله. مثال اخر على التعامل مع عبارة المحاولة واالستثناء: 56 والتوضيح لتسلسل التنفيذ كما في ادناه: 57 وهذه نتيجة التنفيذ في حالة تبديل قيمة المتغير ( )astrوجعلها قيمة عددية حيث يتم تنفيذ ما بداخل عبارة ( )tryوكما في ادناه: 58 واخيراً البد من اإلشارة الى ان عبارة المحاولة واالستثناء يفضل ان تستخدم في كل البرامج التي تتضمن نوع من االدخال للمستخدم وعادة تستخدم لوضع رسالة تظهر للمستخدم في حالة ادخال خاطيء وغير مناسب لمتطلبات البرنامج وكما في ادناه: 59 واما في حالة ادخال قيمة صحيحة فيكون التنفيذ كما في ادناه: 60 وفي نهاية درس اليوم ارفق لكم احبتي بعض األمثلة المحلولة لبرامج ذات متطلبات معينة أتمنى ان تكون مفيدة لكم ومن هللا التوفيق: 61 62 الدرس التاسع :الدوال ()functions الدوال او البرامج الفرعية كما تسمى في بعض لغات البرمجة هي قطع برمجية يتم انشائها من قبل المبرمج ( user defined )functionsاو تكون موجودة في لغة البرمجة مبنية بداخلها ( )built in functionsويتم استدعائها بعد انشائها بأي عدد من المرات وتعتبر بديالً ممتازاً لكتابة هذه االكواد والقطع البرمجية مئات المرات داخل البرنامج الواحد .فمثالً لو احتجنا الى استدعاء دالة المفكوك ( )factorialفي برنامج لحل المعادالت المعقدة عدداً كبيراً من المرات فبدل ان نقوم بكتابة كود المفكوك كل مرة نحتاجه فيها ،نقوم بوضع هذا الكود داخل دالة نستدعيها كل مرة ولمتغيرات مختلفة حيث نقوم بتمرير األرقام او المتغيرات التي نريد حساب مفكوكها كل مرة بدل كتابة كود جديد. ولتوضيح فائدة الدوال نقوم بتنفيذ المثال التالي: 63 هنا نالحظ األمور التالية: -9لتعريف دالة معينة نسبق اسمها بالعبارة المفتاحية ( )defوهي مختصر كلمة ( )Defineبمعني تعريف. -7نكتب اسم الدالة بعد ذلك متبوعة بأقواس فارغة (او تحتوي شيئا ً ما سنشرحه الحقاً) ثم (): -3نالحظ ان المفسر يقوم مباشرة بتزحيف ( )shiftالعبارات داخل جسم الدالة بمقدار 4فراغات ( )4 spacesليدل على اننا االن نكتب بداخل جسم الدالة. -4يمكن ان تحتوي الدالة على أي عدد من العبارات البرمجية الحسابية او المنطقية او التكرارية او الشرطية. -5لتعريف المفسر ان جسم الدالة قط انتهى نقوم فقط بالنزول الى سطر جديد والرجوع الى بدايته أي الغاء المسافات التلقائية ونحن بذلك نقوم بأخبار المفسر ان جسم الدالة قد انتهى. -6كل ما سبق يسمى تعريف الدالة ( )function definitionوهو يقول للمفسر فقط خذ بنظر االعتبار وجود هذه الدالة وال يتم تنفيذ أي جزء منه حتى يتم استدعاء الدالة ( )function call or revokeوالذي يتم بكتابة اسم الدالة متبوعة باألقواس الفارغة او المملوءة بشيء ما (سنعرفه بعد قليل). -2يتم تنفيذ ما بداخل الدالة عند استدعائها وبأي عدد من المرات داخل البرنامج وهذه هي الميزة الرئيسية والفائدة الكبرى للدوال :تجنب تكرار كتابة نفس الكود أكثر من مرة. -9يمكن كتابة أي عدد من الدوال في أي مكان من البرنامج واستدعائها عند الحاجة ألي عدد من المرات. واالن لمزيد من األمثلة لتوضيح الفكرة: 64 وهذا المثال ايضاً: 65 هنا نرى ان االقواس لم تعد فارغة والسبب في ذلك اننا في هذه الدالة قمنا باستدعاء الدالة لتنفيذ ما بداخلها لقيمة معينة يتم استيرادها من البرنامج الرئيسي وهي قيمة المتغير ( )nوالتي تأخذ محتواها من ادخال من المستخدم وهنا يكون تسلسل التنفيذ كاالتي: -9يتم تعريف دالة للمفسر اسمها ( )repeatوتحتوي متغير استدعاء ( )argumentاسمه (.)name -7تحتوي الدالة على عبارة واحدة تتمثل في طباعة قيمة المتغير (.)name -3بعد ذلك نقوم بتعريف متغير اسمه ( )nوهو عبارة عن قيمة يتم إدخالها من قبل المستخدم بدالة (.)input -4واالن نقوم باستدعاء دالة ( )repeatللمتغير ( )nأي اننا نقول للمفسر :خذ قيمة المتغير ( )nوضعها بدل متغير الدالة المسمى ( )nameثم طبق ما بداخل الدالة لهذا المتغير (.)n -5عندها يقوم المفسر بأخذ قيمة المتغير ( )nوهي شيء يقوم المستخدم بإدخاله ويضعها بدل المتغير ( )nameفي الدالة ويطبق الدالة (التي تحتوي عبارة واحدة هي طباعة قيمة المتغير .)name -6بعدها يكمل البرنامج عمله بشكل طبيعي بتكرار استدعاء الدالة للمتغير ( )nنفسه. 66 ولكن ماذا يحصل لو أردنا تكرار تنفيذ الدالة لمتغيرات مختلفة؟ دعونا نرى االن: هنا نرى ميزة أخرى وفائدة أخرى من فوائد الدوال وهي اننا قمنا باستدعاء الدالة ألكثر من متغير وبعدة أسماء وقيم وهي ( )n,x,yوفي كل مرة يتم استدعاء الدالة فيها يتم طباعة او تنفيذ الدالة بشكل مختلف. واالن نأتي الى توضيح أحد مميزات الدوال األخرى وهي استخدام دالة ( )Returnإلرجاع قيمة من الدالة الى البرنامج الرئيسي وكما في المثال ادناه: 67 في هذا المثال نالحظ ان التنفيذ لم يختلف عن المثال السابق بإضافة عبارة ( )Returnفي نهاية الدالة وذلك ألنها هنا عبارة فارغة تقول للمفسر :قم بإرجاع نتيجة تنفيذ الدالة الى البرنامج الرئيسي حين يتم استدعاء الدالة .ولكن لهذه الدالة فوائد أخرى وكما يوضحها المثال التالي: 68 والحظ الفرق في التنفيذ االن: 69 هنا تم التنفيذ بنفس الطريقة تماما ً كما في المثال السابق رغم وجود سطر إضافي للطباعة بعد عبارة ( )Returnداخل الدالة وهذه من فوائد عبارة االرجاع ( ) returnحيث انها تؤشر نهاية الدالة وتخبر المفسر ان الدالة قد انتهت وان كل ما ورائها من العبارات المزحفة ( )indentedليست ذات أهمية بل ان المفسر يهملها مباشرة. االن بعد ان شرحنا كيفية انشاء واستدعاء الدوال المعرفة من قبل المبرمجين ( )user defined functionsقد يتساءل البعض عن ماهية الدوال المبنية بداخل اللغة ( )built in functionsولتوضيح فكرتها نقوم بالتذكير بالدوال التالية: 70 حيث تعتبر هذه الدوال هي من الدوال الجاهزة المخزونة بداخل لغة البرمجة لتحديد نوع المتغيرات والثوابت والتحويل بينها. المزيد من األمثلة عن الدوال: 71 المثال أعاله لدالة بدون استدعاء. هنا تم استدعاء الدالة فظهرت نتيجة تنفيذها. واالن مثال عن كيفية توظيف الشروط بداخل الدوال: 72 مثال اخر عن العمليات الرياضية واستدعاء الدالة ألكثر من متغير في نفس الوقت: 73 يجدر بالذكر ان بعض الدوال ال ترجع أي قيمة الى البرنامج الرئيسي وانما تستخدم للعمل بشكل مستقل عن البرنامج الرئيسي وفي هذه الحالة تسمى تلك الدوال بالدوال غير المثمرة ( )unfruitful functionsاو بتعبير المبرمجين (.)void functions واخيراً ولمن لم يستوعب فوائد الدوال نذكر النقاط التالية: -9يفضل استخدام الدوال لتنظم الكود وتمييز مكوناته المتعددة. -7يفضل استخدام الدوال لتجنب إعادة وتكرار كتابة نفس االكواد مرات متعددة داخل البرنامج. -3إذا أصبح البرنامج كبيراً جداً او طويالً فيفضل تجزئته الى دوال متعددة صغيرة للسيطرة عليه أكثر وتسهيل اكتشاف األخطاء ومعالجتها. -4تستخدم الدوال ايضا ً في انشاء مكتبات المستخدم ( )user defined librariesكما سنتعلم ذلك الحقا ً للكودات التي تحتاج اليها بشكل متكرر وكذلك لتسهيل مشاركة تلك المكتبات مع المبرمجين االخرين. 74 الدرس العاشر :الحلقات التكرارية ()While بعد ان شرحنا اساسيات البرمجة بلغة بايثون في الدروس السابقة ،نصل اليوم الى شرح اول أداة من أدوات الحلقات التكرارية والتي تختص بالحلقات التكرارية الغير محددة المدى ( )indefinite loopsحيث ال نعرف كم مرة سيتم تنفيذ الحلقة التكرارية بالضبط وانما يعتمد ذلك على نوع مدخالت المستخدمين وظروف التنفيذ واالداة المستخدمة لذلك هي نفسها المستخدمة في الكثير من لغات البرمجة األخرى مثل السي والسي بلس بلس والجافا وهي ( )whileواما كيفية استخدامها فيوضحها المثال التالي: وهنا نالحظ اننا اعطينا قيمة أولية للمتغير ( )nثم كتبنا العبارة ( )while n>0:والتي تقول للمفسر :طالما ان ال( )nأكبر من السفر استمر في التنفيذ وكرر كل ما بداخل عبارة ( .)whileوهنا وكما ذكرنا سابقا ً ال تمتاز عبارة ( )whileعن بقية البرنامج بأقواس تحدد بداية ونهاية محتوياتها وانما بالمسافات ( .)indentsوبعد ان يختبر المفسر كون الشرط صحيح يقوم بالدخول الى داخل عبارة ( )whileوينفذ محتوياتها وهي هنا طباعة قيمة ( )nثم إنقاصها واحد وتكرار اختبار الشرط وهكذا حتى يصبح الشرط غير صحيح (حين تصبح nصفر) فيخرج المفسر من اللوب (الحلقة التكرارية) وينفذ ما بعده وهي عبارات طباعة فقط. 75 لتوضيح االمر أكثر الحظ المخطط التوضيحي التالي: وهنا قمنا بتوضيح الية التنفيذ بشكل رسومي للتوضيح أكثر. مشاكل التعامل مع عبارة (:)while لكيال يتم فهم العنوان هنا بشكل خاطئ ،فأن عبارة whileممتازة في الكثير من الحاالت وال اشكال في استخدامها في البرمجة ولكن بشروط: تحديد نهاية متوقعة للتنفيذ ومنع الحلقات الالمتناهية ( )infinity loopsوكما سنرى. -تحديد شروط أولية للعبارة تسمح بالدخول الى داخل عبارة whileواال فاستخدامها عبثي وكما سنرى ايضاً. 76 الحلقة الالنهائية: هنا نالحظ ان شرط whileسيبقى صحيحا ً الى ما ال نهاية ولذا تظهر الرسالة التالية عند محاولة التنفيذ: وهنا يخبرنا المفسر ان نهاية الحلقة التكرارية غير معرفة والمشكلة هنا اننا لم نضع عبارة تحديد نهاية اللوب مثل ( )n=n-1او غيرها من العبارات التي تغير قيمة المتغير في الشرط. عبارة ( )whileبال فائدة: 77 هنا نالحظ ان شرط ( )whileلن يتحقق ابداً ولذا فال فائدة من وجودها اصالً .وهذه امثلة على األخطاء التي يقع فيها المبرمجون حين التعامل مع عبارة ( )Whileلذا يجب الحذر. كسر حلقة التكرار بشرط معين: نحتاج بعض األحيان الى إيقاف الحلقة التكرارية حين يتحقق شرط معين مثل وجود رقم معين كنا نبحث عنه او ادخال المستخدم لقيمة معينة كنا نبحث عنها وهنا نستخدم عبارة ( )breakوالتي تقول للمفسر :قم بأنهاء الحلقة التكرارية واقفز الى ما بعدها .وكما في المثال التالي: هنا قمنا بوضع شرط لكسر حلقة التكرار وهو ادخال قيمة 6وقد حصل ذلك كما في نافذة التنفيذ أعاله. 78 ترك تنفيذ الحلقة في المنتصف بشرط معين: في بعض األحيان نحتاج الى ترك الحلقة التكرارية الحالية في المنتصف والقفز الى بداية الحلقة من جديد الستئناف التنفيذ حين يتحقق شرط معين ونستخدم عبارة ( )continueلهذا الغرض وكما في المثال ادناه: هنا استخدمنا نفس المثال السابق مع إضافة شرط يقول (إذا كانت قيمة االدخال تساوي jumpفقم بالقفز الى نهاية الحلقة التكرارية بدون اكمالها) وهذا ما حصل حيث اننا حين قمنا بإدخال عبارة jumpقام المفسر بالقفز الى بداية حلقة جديدة 79 بدون اكمال الحلقة الحالية ويتضح ذلك برؤية انه لم يطبع عبارة jumpأي انه أهمل االيعاز () )print (xبعد عبارة continueحين تحقق شرطها. مثال اخر على كيفية التعامل مع ( )continueو (:)break والشرط للقفز هنا كان ادخال عبارة اول حرف فيها (] )line[0هو الرمز ( )#حيث ال يتم طباعته واما لكسر الحلقة فيكفي ادخال عبارة ( )doneوهكذا. مالحظة :كل ما شرحناه هنا عن عبارة ( )whileيسمى الحلقات التكرارية غير المحددة ألنها كما رأينا ال تلتزم بشرط توقف معروف وانما تعتمد في اغلب األحيان على ادخاالت المستخدم وظروف التنفيذ ونتائج العمليات السابقة واما ما سنشرحه ان شاء هللا في الدرس القادم فسيكون متركزاً على الحلقات التكرارية المحددة ( )definite loopsوالتي يمكن برمجتها باستخدام األداة الشهيرة في كل لغات البرمجة تقريبا ً ( )forفتابعوا معنا 80 مثال أخير العتماد شرط التوقف على العمليات الرياضية المتكررة: هنا كان شرط االستمرار ( )continueان يكون ناتج الجمع 92وشرط كسر الحلقة التكرارية ( )breakان يكون الناتج أكثر من 92واما التنفيذ الطبيعي للحلقة التكرارية كاملة فيكون لقيم ناتج الجمع أصغر من .92 81 الدرس الحادي عشر :الحلقات التكرارية بأستخدام ()for بعد ان شرحنا كيفية برمجة الحلقات التكرارية الغير محددة المدى ( )indefinite loopsبأستخدام عبارة ( )whileفي الدرس الماضي ،نأتي اليوم الى شرح عبارة ( )forالتي تستخدم لعمل حلقات تكرارية محددة ( )definite loopsوصيغتها العامة تختلف قليالً عما كانت عليه في لغات سي وسي بلس بلس وجافا وهي كاالتي: for (iterations variable) in (list of numbers, names, …etc.) : statement statement the rest of the program حيث يمثل ( )iteration variableمتغير التكرار وهو المتغير الذي سيحدد كم مرة سيتم تكرار تنفيذ ما بداخل عبارة (.)for واما ( )list of numbers, names, …etc.فهو المدى او قائمة األرقام او األسماء او المتغيرات التي سيتحرك ضمنها متغير التكرار ليأخذ قيمها كل مرة. واخيراً ( )statementهي العبارات داخل عبارة ( )forوالتي تتكرر اعتماداً على متغير التكرار ونالحظ انها مزحفة الى اليمين بمقدار 4فراغات ( )4 spacesكما في كل العبارات األخرى لتحديد بداية ونهاية العبارات التابعة لل (.)for اما ( )the rest of the programفهو تكملة البرنامج ونالحظ انه غير مزحف أي انه يبدأ من بداية السطر ليحدد انه غير تابع لعبارة (.)for مالحظة مهمة جداً :يجب مراعاة عدم نسيان ( ):في نهاية كل من عبارات الشروط والتكرار فهي مهمة جداً وال ينفذ البرنامج بدونها. وفي ادناه مثال بسيط يوضح الفكرة: 82 وهذا ابسط مثال على كيفية استخدام عبارة ( )forحيث عرفنا متغير التكرار على ان اسمه ( )iوهو يأخذ قيمه من القائمة التي تبدأ من 9وتنتهي بال 1واخيراً وبداخل ال( )Forقلنا للمفسر فقط اطبع لنا قيم (.)i امثلة أخرى اكثر تفصيالً: 83 هنا كانت قيم متغير التكرار ( )iهي أسماء من قائمة أسماء وليست ارقام. 84 جدول الضرب لألعداد من 9الى 5موضحا ً في المثال أعاله. واما لمعرفة كيفية فهم المفسر لعمل عبارة ( )forوكيفية تسلسل تنفيذ عباراتها الداخلية فالمخطط التالي يشرح ذلك ببساطة: 85 حيث ان االمر كما هو مسمى (حلقة تكرارية) يقوم فيها المفسر بأسناد قيم الى متغير التكرار من القائمة في كل مرة احد القيم وينفذ العبارات داخل ال ( )Forثم يعود ليسند له القيمة التالية وهكذا: 86 المثال أعاله يبين ان متغير التكرار ال يشترط ان يكون موجوداً في عبارات داخل عبارة ( )Forبل انه يمكن ان يستخدم كمتغير تكرار للمفسر فقط وليس للمستخدمين. 87 برنامج أليجاد العدد األكبر في قائمة اعداد في الصورة أعاله. واالن نفس البرنامج مع إضافة قابلية حساب عدد مرات التكرار للحلقة التكرارية وكما في ادناه: 88 أليجاد مجموع قيم متغير التكرار يمكن االستعانة بالبرنامج التالي: 89 واالن لحساب معدل مجموعة من األرقام نالحظ المثال التالي: 90 وألستخدام كل من عبارات التكرار والشروط يمكن مالحظة المثال التالي: 91 92 الدرس الثاني عشر :المزيد عن الحلقات التكرارية بعد ان شرحنا العبارات المستخدمة في الحلقات التكرارية مثل ( )whileو ( )forنأتي اليوم الى مناقشة مشكلة يوضحها المثال التالي: شرحنا في المحاضرة السابقة كيفية إيجاد العدد األكبر من ضمن سلسلة (قائمة او مصفوفة) من االعداد وكما في الصورة التالية: وهنا كما هو واضح اعتمدنا على إعطاء قيمة أولية للمتغير األكبر ( )largest_so_farوهي قيمة صغيرة مقدارها سالب واحد وقد حصلنا على نتائج صحيحة ولكن ماذا لو كانت كل االعداد في القائمة سالبة واصغر من السالب واحد؟ دعونا نرى ماذا سيكون اإلخراج: 93 كما هو متوقع تماماً ،قام المفسر بمقارنة القيمة األولية وهي سالب واحد بكل القيم األخرى التي يصدف انها كلها اصغر منه فقام بالقول بأن اكبر قيمة في القائمة هي سالب واحد مع العلم ان القائمة ال تحتوي هذا الرقم وهو خطأ كبير يؤشر حاجتنا الى شيء اخر لتصحيح البرنامج. مثال اخر على نفس المشكلة :وهو البحث عن اصغر عدد في القائمة وكما في الصورة ادناه: نفس المشكلة ،ألن القيمة األولية للمتغير ( )smallest_so_farاصغر من كل القيم في القائمة فقد اظهر المفسر نتيجة تقول بأن األصغر في القائمة هو سالب واحد علما ً ان القائمة ال تحتوي هذا المتغير وهو برنامج خاطيء اخر! اذا ما الحل لذلك؟ الجواب ببساطة :القيمة االفتراضية ( .)Noneنعم انها كلمة مفتاحية محجوزة في لغة بايثون وتستخدم للتعامل مع هذا النوع من المشاكل حيث يتم إعطاء قيمة أولية للمتغير هي ( )Noneثم يقوم المتغير بأخذ قيمة اول متغير او ثابت في القائمة او المصفوفة المراد البحث بداخلها عن األكبر او األصغر وكما في المثال التالي: 94 واالن لنشرح خطوات البرنامج: السطر األول :إعطاء قيمة أولية للمتغير ( )smallestمقدارها (.)None السطر الثاني :طباعة عبارة ()before السطر الثالث :عبارة forللبحث بداخل القائمة السطر الرابع :وهو مهم جداً والهدف منه اختبار شرط يتحقق مرة واحدة فقط عند بداية اللوب عندما تكون ( )smallest=Noneفيقوم بأسناد قيمة المتغير األول في القائمة (الذي قيمته االن مخزونة في )valueالى المتغير ( )smallestفي السطر الخامس ثم يبدأ بعدها بالمقارنة. السطر السادس :عملية المقارنة المتكررة لكل عنصر في القائمة بالمتغير ( )smallestحتى اذا تحقق الشرط ان احد عناصر القائمة اصغر من ( )smallestفيقوم المتغير ( )smallestبأخذ قيمة ذلك العنصر كما في السطر السابع. واخيراً السطر الثامن طباعة نتيجة كل حلقة تكرارية قبل البدء بها من جديد والسطر األخير طباعة النتيجة النهائية بعد اكمال الحلقة التكرارية. واالن نأخذ مثال على كيفية البحث عن عنصر معين في قائمة بأستخدام القيم المنطقية صح ( )Trueوخطأ (:)False 95 وهنا نالحظ ان القيمة األولية ليست رقم وال قيمة ( )Noneوانما القيمة المنطقية ( )Falseوالتي تصبح ( )Trueحين العثور على المتغير او القيمة المطلوبة وهكذا. واخيراً في الصورة ادناه مثال محلول عن كيفية استخدام الحلقات التكرارية بشكل احترافي: 96 الى هنا ينتهي الجزء األول من هذه الدورة المستمرة للبرمجة بلغة بايثون والتي ستتضمن ان شاء هللا في الجزء الثاني كيفية التعامل مع السالسل الرمزية ( )stringsوالملفات ( )filesوالقوائم ( )listsوصوالً الى البرمجة الموزعة عبر الشبكات. هذه الدروس وغيرها الكثير تم نشرها في مدونة مصطفى صادق العلمية التي يمكن زيارتها لالطالع على المزيد على الرابط التالي: 97