Professional Documents
Culture Documents
قبل البدء في شرح اساسيات البرمجة بلغة بايثون دعونا نتصفح بعضا ً من مميزاتها ونوضح كل منها وكما يلي:
ظهرت لغة بايثون ألول مرة عام 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
2
واالن بعد اكتمال التنصيب نذهب الى قائمة ( )Startونكتب في خانة البحث ( )idleلتظهر لنا ضمن النتائج ال ( IDLE
)Python GUIفنقوم بفتحها لتظهر الواجهة التالية:
وهذه الواجهة تمثل الواجهة الرسومية لتطوير وتطبيق برامجنا التي سنعمل عليها في هذا الدرس والدروس القادمة ان شاء
هللا تعالى.
االن ننتقل الى الخطوة المهمة األخرى وهي ضبط بيئة الويندوز للعمل على البايثون خارج ال ( )IDLEالخاص به في سطر
األوامر ( )Command Promptاو غيرها ويتم ذلك بالنقر نقرة يمين على ايقونة جهاز الكومبيوتر ثم الذهاب الى
propertiesثم ( )advanced system settingsلتظهر النافذة التالية:
3
وهنا قمنا بتعريف متغير جديد للويندوز اسمه ( )pythonوامتداده هو امتداد تنصيب المفسر الذي قمنا بتنزيله وتنصيبه قبل
قليل وهو في الوضع الطبيعي (.)c:\python34
بعدها ننقر على ( )okوبذلك تنتهي عملية تهيئة بيئة الويندوز للتعامل مع البايثون في التطبيقات المختلفة.
5
بعد ان شرحنا كيفية تنزيل وتنصيب البرمجيات الالزمة للبدء بالعمل على لغة بايثون في الدرس السابق ،وشرحنا ايضا ً كيفية
اعداد بيئة نظام تشغيل الويندوز للتعامل مع هذه اللغة .نأتي اليوم الى البدء بالتعامل مع هذه اللغة وكيفية كتابة اول برنامج
باستخدامها ولكن قبل ذلك ال بد من ذكر مالحظة مهمة جداً وهي اننا اعتمدنا في شرحنا لهذه الدروس على تطبيق ( IDLE
)Python GUIولكن هناك الكثير من التطبيقات األخرى التي يمكن استخدامها لكتابة برامج بايثون واختبار أدائها وتطويرها
ومن أهمها هو ( )Notepad ++والذي يمكن تنزيله من الرابط التالي /https://notepad-plus-plus.org :ورغم اننا
لن نتعامل معه في شروحاتنا اال انه من األفضل ذكره لمن احترفوا استخدامه في تطوير برمجيات بقية لغات البرمجة سابقا ً
او يحاولون التعامل معه االن بدءاً من لغة بايثون علما ً انه يتمتع بمميزات اكثر بكثير من مفسر بايثون التلقائي الذي قمنا
بتنصيبه في الدرس السابق وهو ( )IDLEالذي سنعمل عليه في دورتنا هذه.
نذهب الى قائمة ( )Startونقوم بفتح تطبيق ( )IDLE Python GUIالذي قمنا بتنصيبه سابقا ً لتظهر النافذة التالية:
االن نرى محرك األوامر (>>>) وهو محرك األوامر الخاص بلغة البايثون ويعني اننا مستعدون للبدء بكتابة برنامجنا األول
والذي سيكون كما في كل لغات البرمجة لطباعة عبارة ( )hello worldعلى الشاشة والذي يتكون في لغة بايثون من سطر
واحد فقط على خالف بقية لغات البرمجة األخرى مثل السي بلس بلس والجافا واليكم مقارنة بسيطة بينها بخصوص هذا
البرنامج:
6
وكما الحظنا هنا فأن طباعة عبارة ( )Hello worldتتطلب سطراً واحداً فقط وهو
7
االن قد يتساءل البعض عن كيفية طباعة عدة أسطر دفعة واحدة او تنفيذ مجموعة من األوامر دفعة واحدة (كما هو الحال في
بقية لغات البرمجة) والحل لذلك سهل جداً وهو سياقنا الذي سنتبعه في الشرح للدروس القادمة:
8
نقوم بالنقر على مكان فارغ في سطح المكتب نقرة يمين ثم نختار ( )newثم ( )text documentونسمي الملف باسم معين
ونغير امتداده الى ( ).pyوهو امتداد ملفات البايثون وكما في ادناه:
ولمن ال يعرف كيفية عرض امتدادات الملفات فهو امر سهل جداً:
نفتح ( )my computerثم نذهب الى قائمة ( )toolsومنها نختار ( )folder optionsثم ( )viewلتظهر النافذة التالية:
االن نقوم بإزالة عالمة الصح (ان كانت موجودة) من المربع امام خيار ()Hide extensions for known file types
ثم ( ) okوبعدها سنالحظ ان كل الملفات في الحاسوب ستظهر مع امتداداتها مما يسمح لنا بتغيير امتداد أي ملف بحسب
9
االن نقوم بالنقر نقرة يمين على هذا الملف واختيار ( )edit with idleلتفتح النافذة التالية:
االن نكتب أي عدد من أوامر البايثون هنا وألننا لحد االن ال نعرف سوى ايعاز الطباعة ( )printفسنكتب التالي:
10
هنا يطلب منا حفظ الملف ( )saveحيث تتميز ملفات البايثون بعدم القابلية للتنفيذ بدون حفظ فننقر على ( )okليتم حفظ
تغييرات الملف وتنفيذه فيما بعد لتظهر النتائج التالية:
11
12
بعد ان شرحنا بيئة العمل في البايثون وبعض أدوات اإلخراج ( )printفي الدروس السابقة نأتي اليوم لنشرح أحد أدوات
االدخال وهي أداة ( )inputوالتي يمكن استخدامها بالطريقة التالية:
وكما تالحظون فأن االدخال هنا يتم اسناده مباشرة الى متغير اسمه على سبيل المثال ( )xويمكن استخدام أي اسم اخر طبعا ً
وبنفس شروط التسمية في بقية لغات البرمجة األخرى مثل ان يحتوي االسم على أي تركيبة من الحروف واألرقام بشرط ان
ال يبدأ برقم وان ال يحتوي عالمة ( )underscoreوهي (_) وبقية الشروط المعروفة لكل المبرمجين.
كذلك من األمور التي يجب مالحظتها هنا وهي فرق رئيسي بين لغة بايثون وبقية اللغات انها ال تحتاج تعريف المتغير قبل
استخدامه أي اننا نستطيع اسناد أي قيمة الى المتغير ( )xكمثال واستخدامها واليكم المثال التالي:
-9إمكانية اسناد أي قيمة الى أي متغير مباشرة وبدون اعالن مسبق عن نوع المتغير.
13
واالن نعود الى أداة االدخال موضوع الدرس ونكتب الكود التالي في ملف ( ).pyكما فعلنا في الدروس السابقة وكما في ادناه:
14
هنا قمنا بإدخال قيمة المتغير ( )xوهي كلمة ( )mustafaفقام المفسر بأسنادها الى المتغير xثم طباعتها استناداً الى االيعاز
الثاني printواليكم مجموعة ايعازات أكثر توضيحا ً للفكرة:
15
االيعاز األول لعرض رسالة للمستخدم تطلب منه ادخال قيمة معينة ليتم اسنادها الى المتغير xكسلسلة رمزية (.)String
االيعاز الثالث لعرض رسالة للمستخدم تطلب منه ادخال قيمة معينة ليتم اسنادها الى المتغير yكسلسلة رمزية (.)String
االيعاز الرابع لعرض رسالة للمستخدم تطلب منه ادخال قيمة معينة ليتم اسنادها الى المتغير zكسلسلة رمزية (.)String
16
االيعاز الخامس هو أداة تحويل للسلسلة الرمزية المخزونة في ( )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
هنا رأينا كيف ان الكلمات التي بعد العالمة ( )#لم يتم اخذها بعين االعتبار عند التنفيذ فالمفسر ال ينظر اليها اصالً وهي
للمبرمج فقط وليس للمستخدمين وهي ذات أهمية كبيرة للمبرمجين خصوصا ً للبرامج الكبيرة والمتشعبة.
االن ننتقل الى الجزء الثاني من درسنا اليوم وهو كيفية التعامل مع األرقام في البايثون:
-استخدام البايثون كألة حاسبة:
نستطيع استخدام محرك األوامر في مفسر البايثون كألة حاسبة مباشرة وكما يلي:
20
ويعلم مبرمجي لغات الجافا والسي بلس بلس ان هذا غير مقبول في تلك اللغات مما يميز لغة بايثون عنها في هذا المجال.
كذلك يمكن التعامل مع االعداد المركبة وهي االعداد التي تتكون من جزئين حقيقي وتخيلي ( )x+jyحيث يمثل ال ( )jقيمة
غير حقيقية تمثل جذر السالب واحد وكما في ادناه:
21
22
23
حيث نرى رسالة الخطأ واضحة بعدم قابلية تحويل االعداد المركبة الى اعداد عشرية ولكننا نستطيع إيجاد القيمة المطلقة
للعدد المركب وهي الجذر التربيعي لناتج جمع الجزء الحقيقي تربيع مع الجزء التخيلي تربيع وكما في ادناه:
))Abs(a)=sqrt((a.real*a.real)+(a.imag*a.imag
وكما في ادناه:
24
وكما نرى هنا فقد تم التعامل مع المتغير (_) على انه قيمة عددية تدخل في الحسابات وحين قمنا بطرحه من نفسه وكان
الناتج صفر ،تم خزن الصفر في نفس المتغير وحين حاولنا القسمة عليه ظهر خطأ عدم قابلية القسمة على صفر.
25
بعد ان شرحنا أدوات االدخال واإلخراج والتعليقات واألرقام نأتي اليوم الى كيفية التعامل مع السالسل الرمزية وهي ببساطة
أي تركيبة من الحروف واألرقام والرموز الخاصة ويتم ببساطة إدخالها الى المفسر محصورة بين عالمات اقتباس مفردة
(‘ ‘) او عالمات اقتباس مزدوجة (" ") وكما في المثال ادناه:
وكما نرى هنا فأن أي شيء محصور بعالمات اقتباس يتم طباعته بدون تصرف من المفسر وكذلك فأن اسناد هذه السالسل
الرمزية الى متغيرات وطباعتها مرفقة مع بعضها البعض يتم باستخدام عالمة ( )+والتي تمثل هنا عالمة ارفاق
( )appendingوليست جمع حيث يتم طباعة المتغير األول ثم الثاني وهاكم مثاالً اخر لتوضيح الفكرة:
26
كذلك فأن السالسل الرمزية يمكن ان تمتد ألكثر من سطر واحد كما هو الحال في بقية لغات البرمجة األخرى وباستخدام (\)\n
كما في المثال ادناه:
27
28
29
السطر األول كان إلدخال قيمة سلسلة رمزية اسمها ( )stringومحتوياتها ()hello
السطر الرابع ] string[5يطلب طباعة الرمز السادس من السلسلة وألن السلسلة تتكون من 5رموز فقط فقد حصلنا على
رسالة خطأ.
السطر الخامس يطلب طباعة الرموز من 7الى 4مع عدم شمول الرمز الرابع فقام بطباعة الرمزين الثاني والثالث فقط
السطر السادس يطلب طباعة الرموز من 7الى 5مع عدم شمول الرمز الخامس (الغير موجود اصالً) فقام بطباعة الرموز
الثاني والثالث والرابع.
السطر السابع ] string[:3يطلب طباعة كل شيء قبل الرمز الرابع (الذي فهرسه )3
السطر األخير ] string[3:يطلب طباعة الرمز الرابع (ذو الفهرس )3وما بعده.
وهكذا نستطيع تعميم كل هذه المعلومات على بقية السالسل الرمزية األخرى.
مالحظة :على خالف بقية لغات البرمجة فأن لغة بايثون ال تتقبل تغيير قيم رموز داخل السالسل الرمزية وكما موضح في
المثال ادناه:
30
31
32
33
كما في كل لغات البرمجة األخرى ،فأن لغة البايثون توفر دالة حساب طول السلسلة الرمزية وهي ) len(stringوكما في
ادناه:
34
قبل البدء بمحتوى درس اليوم هناك مجموعة من المالحظات التي يجب االنتباه لها:
-9اننا في هذه الدروس نعمل بشكل متبادل على لغات البايثون 7والبايثون 3ورغم التشابه الكبير بينهما اال ان هناك
اختالفات جوهرية بين تراكيب الجمل البرمجية الخاصة بكل منهما لذا يجب االنتباه الى أي منهما قمتم بتنصيبها وهو
السبب في ظهور بعض رسائل الخطأ للبرامج التي نكتبها هنا.
-7مما ال شك فيه ان كل هذه الدروس ستكون بدون فائدة من دون تطبيق لكل خطوة نشرحها والسؤال عن كل شيء
غير مفهوم بل والتفكير اإلبداعي فيما وراء المشروح ومحاولة تجربة كل ما يخطر ببالكم وبأبسط األدوات بالتدريج
فهكذا يتكون العقل البرمجي لديكم بالتجربة والخطأ الى حد الوصول الى مرحلة التمرس فالبرمجة هي لغة الممكن
كالسياسة تماما ً .
-3سيتم تطبيق بعض البرامج في بيئة الدوز في الويندوز ( )command promptفي حين سيتم تطبيق البرامج
األكبر واألكثر تعقيداً كما شرحنا باستخدام برنامج ( )IDLE Python GUIلذا يرجى مالحظة الفرق بينهما عند
التنفيذ.
-4اعود وأؤكد على أهمية المتابعة والتطبيق والسؤال عن كل ما هو غير مفهوم ونحن هنا ننتظر اسئلتكم لتوضيح ما
نحتاج اضافته الى المادة العلمية التي ننشرها لتعميم الفائدة وعدم الوقوع في نفس األخطاء مرة بعد أخرى.
واالن نبدأ درس اليوم وبعد ان شرحنا أدوات االدخال واإلخراج والتعليقات وبعض األمور األخرى في الدروس السابقة وقبل
البدء بشرح أدوات الشروط والتكرار ،نود ان نذكر المعلومات البديهية (للمبرمجين القدامى والمحترفين) التالية:
ثوابت رقمية مثل ( )11, 22.4, -45وهي األرقام الصحيحة والكسرية الموجبة والسالبة التي يمكن إدخالها مباشرة بأسنادها
الى متغيرات او عن طريق لوحة المفاتيح باستخدام أدوات االدخال ( )inputوغيرها.
الثوابت النصية او السالسل الرمزية مثل (” )“hello worldوالتي يتم إدخالها محصورة بين عالمتي اقتباس مفردة او
مزدوجة وكما رأينا في الدروس السابقة.
35
وهي األسماء التي تطلق على مواقع خزن البيانات في الذاكرة حيث يستطيع المبرمج خزن واسترجاع البيانات بداخلها
ويستطيع المبرمج تحديد اسم المتغير وكذلك تحديد نوعية محتوياته (بدون تصريح مسبق) على خالف بقية لغات البرمجة
األخرى.
شروط تسمية المتغيرات :كل لغات البرمجة فيها شروط معينة لتسمية المتغيرات وهي تقريبا ً متشابهة في كل لغات البرمجة
وتسمل التالي:
* :Aliألنه يحتوي رمز خاص (*) وهكذا. غير مقبول 123all :ألنه يبدأ برقم.
-الشرط األخير ألسماء المتغيرات ان ال تكون أحد الكلمات المحجوزة للغة وهي التالية:
تتكون برامج البايثون بصورة عامة من أسطر برمجية وتختلف أنواع هذه االسطر البرمجية باختالف مكوناتها وهي كما يلي:
37
38
-االقواس
-األسس
-الظرب والقسمة
-الجمع والطرح
-من اليسار الى اليمين
مثال:
39
مالحظة أخرى :القسمة في البايثون 7معقدة قليالً بحيث ان ناتج قسمة عدد صحيح على عدد صحيح اخر هو عدد صحيح
مع اهمال الكسور العشرية ولكن هذا الشيء اختلف االن مع البايثون 3حيث أصبح المفسر ال يهمل أي جزء من الناتج
ويعرضه كامالً حتى لو كانت القيم االصلية صحيحة وكما في ادناه:
40
في لغة البايثون 7كانت عملية قسمة عدد صحيح على عدد عشري او بالعكس تعطي ناتج عشري دائما ً وهو امر مماثل لما
يحصل االن في لغة بايثون 3التي عالجت المشكلة من األساس.
41
والسبب في الخطأ األول هو محاولتنا جمع عدد صحيح مع سلسلة رمزية وهو خطأ بديهي طبعاً.
اما السبب للخطأ الثاني فعلى الرغم من اننا قمنا بإدخال رقم ( )x=55ومحاولة جمعه مع رقم اخر وهو ( )y=5اال ان رسالة
خطأ قد ظهرت ألن ادخاالت أداة ( )inputكلها تعتبر سالسل رمزية ولمعرفة نوع كل متغير نقوم بكتابة:
وكما في ادناه:
42
وكما في ادناه:
43
كما في كل لغات البرمجة ،فأن لغة بايثون تتعامل مع الشروط بشكل ممتاز وباستخدام عبارة ( )ifوبالصيغة التالية:
If condition:
Statements
Or:
If condition:
Statements
Else:
Statements
وكما يعرف الجميع فأن العبارات ( )statementsال تنفذ اال إذا كان الشرط ( )conditionصحيحا ً واما إذا كان الشرط خطأ
فيتم القفز مباشرة الى العبارات بعد بلوك ال ( )ifوكما في التوضيح التالي:
45
46
حيث نالحظ ان كل لون مختلف هو بلوك يتميز عن بقية البلوكات وبعضها يجتمع بسطر واحد وبعضها بعدة أسطر.
كما يعرف المبرمجون ببقية لغات البرمجة ،فأن عبارة ( )ifتحتوي الكثير من الخيارات والمميزات ومنها انها يمكن ان
تستخدم في التنفيذ بمسار واحد او بعدة مسارات وبحسب نوعية استخدامها وكما في التفصيل ادناه:
47
مالحظة :كما ذكرنا سابقا ً فأن المسافات ( )indentsتعمل بدل االقواس لفصل بلوك ( )ifعن بقية مكونات البرنامج وهنا
يجب االنتباه الى استخدام زر ( )spaceمن لوحة المفاتيح أربع مرات واالبتعاد كليا ً عن استخدام ( )tabألنه يعطي رسالة
خطأ دوما ً حيث يعتبر ال ( )tabرمزاً غير مفهوم للغة بايثون فيجب الحذر.
ولمزيد من التوضيح حول المسافات ودورها في تحديد مسار التنفيذ الحظ األمثلة التالية:
48
49
50
يمكن في هذه الحاالت استخدام ( )elseاو ( )elif = else ifوبحسب الحاجة وكما في ادناه:
51
ويمكن تنفيذ الكود أعاله بعدة طرق اعتماداً على قيمة ( )xوكما في ادناه:
53
واخيراً يمكن كتابة كودات برامج تحتوي على أسطر ال تنفذ ابداً وكما في الصورة التالية:
54
بعد ان درسنا في الدرس السابق هيكل واستخدام األنواع المختلفة لعبارة ( )ifالشرطية ،نأتي اليوم لمناقشة مشكلة تحصل
بكثرة اثناء استخدام أدوات االدخال للمتغيرات والثوابت وهي احتمالية ادخال المستخدم لقيمة ال تطابق شروط البرنامج او ما
يتوقعه المبرمج فيسبب ذلك خطأ في التنفيذ عادة ولكن وجود أداة ( )try-exceptيسمح بتالفي هذه المشاكل وكما في
التوضيح التالي:
Try
Except
نفترض اننا نريد المستخدم ان يدخل قيمة رقمية ( )integer or floatألدخالها في معادالت رياضية ولكنه يصدف ان يقوم
المستخدم بأدخال قيمة متغير رمزي ( )stringمما يسبب توقف التنفيذ وظهور رسالة خطأ وكما في ادناه:
وهنا نرى انه من الطبيعي ان تظهر هذه الرسالة ألننا حاولنا تحويل قيمة رمزية الى عدد صحيح وهو شيء غير مقبول
برمجياً .ولتجنب هذه المشكلة نقوم بالتالي:
55
ان يقوم بأخذ قيمة المتغير ( )xعلى انها ” “firstوالمتغير ( )yعلى انها ” “secondثم قلنا للمفسر حاول ( )tryتحويل
المتغيرين ( )x,yالى قيم صحيحة ،فأن كان ذلك ممكنا ً فسيقوم بتنفيذ ما بداخل عبارة ( )tryواال فسيقفز مباشرة الى ما بداخل
عبارة االستثناء ( )exceptلينفذ ما بداخلها وهو ما حصل أعاله.
56
57
58
59
60
61
الدوال او البرامج الفرعية كما تسمى في بعض لغات البرمجة هي قطع برمجية يتم انشائها من قبل المبرمج ( 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
-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
68
69
االن بعد ان شرحنا كيفية انشاء واستدعاء الدوال المعرفة من قبل المبرمجين ( )user defined functionsقد يتساءل
البعض عن ماهية الدوال المبنية بداخل اللغة ( )built in functionsولتوضيح فكرتها نقوم بالتذكير بالدوال التالية:
70
71
72
73
74
بعد ان شرحنا اساسيات البرمجة بلغة بايثون في الدروس السابقة ،نصل اليوم الى شرح اول أداة من أدوات الحلقات التكرارية
والتي تختص بالحلقات التكرارية الغير محددة المدى ( )indefinite loopsحيث ال نعرف كم مرة سيتم تنفيذ الحلقة التكرارية
بالضبط وانما يعتمد ذلك على نوع مدخالت المستخدمين وظروف التنفيذ واالداة المستخدمة لذلك هي نفسها المستخدمة في
الكثير من لغات البرمجة األخرى مثل السي والسي بلس بلس والجافا وهي ( )whileواما كيفية استخدامها فيوضحها المثال
التالي:
وهنا نالحظ اننا اعطينا قيمة أولية للمتغير ( )nثم كتبنا العبارة ( )while n>0:والتي تقول للمفسر :طالما ان ال( )nأكبر
من السفر استمر في التنفيذ وكرر كل ما بداخل عبارة ( .)whileوهنا وكما ذكرنا سابقا ً ال تمتاز عبارة ( )whileعن بقية
البرنامج بأقواس تحدد بداية ونهاية محتوياتها وانما بالمسافات ( .)indentsوبعد ان يختبر المفسر كون الشرط صحيح يقوم
بالدخول الى داخل عبارة ( )whileوينفذ محتوياتها وهي هنا طباعة قيمة ( )nثم إنقاصها واحد وتكرار اختبار الشرط وهكذا
حتى يصبح الشرط غير صحيح (حين تصبح nصفر) فيخرج المفسر من اللوب (الحلقة التكرارية) وينفذ ما بعده وهي عبارات
طباعة فقط.
75
لكيال يتم فهم العنوان هنا بشكل خاطئ ،فأن عبارة whileممتازة في الكثير من الحاالت وال اشكال في استخدامها في البرمجة
ولكن بشروط:
-تحديد نهاية متوقعة للتنفيذ ومنع الحلقات الالمتناهية ( )infinity loopsوكما سنرى.
-تحديد شروط أولية للعبارة تسمح بالدخول الى داخل عبارة whileواال فاستخدامها عبثي وكما سنرى ايضاً.
76
هنا نالحظ ان شرط whileسيبقى صحيحا ً الى ما ال نهاية ولذا تظهر الرسالة التالية عند محاولة التنفيذ:
وهنا يخبرنا المفسر ان نهاية الحلقة التكرارية غير معرفة والمشكلة هنا اننا لم نضع عبارة تحديد نهاية اللوب مثل
77
نحتاج بعض األحيان الى إيقاف الحلقة التكرارية حين يتحقق شرط معين مثل وجود رقم معين كنا نبحث عنه او ادخال
المستخدم لقيمة معينة كنا نبحث عنها وهنا نستخدم عبارة ( )breakوالتي تقول للمفسر :قم بأنهاء الحلقة التكرارية واقفز
الى ما بعدها .وكما في المثال التالي:
هنا قمنا بوضع شرط لكسر حلقة التكرار وهو ادخال قيمة 6وقد حصل ذلك كما في نافذة التنفيذ أعاله.
78
في بعض األحيان نحتاج الى ترك الحلقة التكرارية الحالية في المنتصف والقفز الى بداية الحلقة من جديد الستئناف التنفيذ
حين يتحقق شرط معين ونستخدم عبارة ( )continueلهذا الغرض وكما في المثال ادناه:
هنا استخدمنا نفس المثال السابق مع إضافة شرط يقول (إذا كانت قيمة االدخال تساوي jumpفقم بالقفز الى نهاية الحلقة
التكرارية بدون اكمالها) وهذا ما حصل حيث اننا حين قمنا بإدخال عبارة jumpقام المفسر بالقفز الى بداية حلقة جديدة
79
والشرط للقفز هنا كان ادخال عبارة اول حرف فيها (] )line[0هو الرمز ( )#حيث ال يتم طباعته واما لكسر الحلقة فيكفي
ادخال عبارة ( )doneوهكذا.
مالحظة :كل ما شرحناه هنا عن عبارة ( )whileيسمى الحلقات التكرارية غير المحددة ألنها كما رأينا ال تلتزم بشرط توقف
معروف وانما تعتمد في اغلب األحيان على ادخاالت المستخدم وظروف التنفيذ ونتائج العمليات السابقة واما ما سنشرحه ان
شاء هللا في الدرس القادم فسيكون متركزاً على الحلقات التكرارية المحددة ( )definite loopsوالتي يمكن برمجتها باستخدام
األداة الشهيرة في كل لغات البرمجة تقريبا ً ( )forفتابعوا معنا
80
هنا كان شرط االستمرار ( )continueان يكون ناتج الجمع 92وشرط كسر الحلقة التكرارية ( )breakان يكون الناتج
أكثر من 92واما التنفيذ الطبيعي للحلقة التكرارية كاملة فيكون لقيم ناتج الجمع أصغر من .92
81
بعد ان شرحنا كيفية برمجة الحلقات التكرارية الغير محددة المدى ( )indefinite loopsبأستخدام عبارة ( )whileفي
الدرس الماضي ،نأتي اليوم الى شرح عبارة ( )forالتي تستخدم لعمل حلقات تكرارية محددة ( )definite loopsوصيغتها
العامة تختلف قليالً عما كانت عليه في لغات سي وسي بلس بلس وجافا وهي كاالتي:
statement
statement
حيث يمثل ( )iteration variableمتغير التكرار وهو المتغير الذي سيحدد كم مرة سيتم تكرار تنفيذ ما بداخل عبارة
(.)for
واما ( )list of numbers, names, …etc.فهو المدى او قائمة األرقام او األسماء او المتغيرات التي سيتحرك ضمنها
متغير التكرار ليأخذ قيمها كل مرة.
واخيراً ( )statementهي العبارات داخل عبارة ( )forوالتي تتكرر اعتماداً على متغير التكرار ونالحظ انها مزحفة الى
اليمين بمقدار 4فراغات ( )4 spacesكما في كل العبارات األخرى لتحديد بداية ونهاية العبارات التابعة لل (.)for
اما ( )the rest of the programفهو تكملة البرنامج ونالحظ انه غير مزحف أي انه يبدأ من بداية السطر ليحدد انه
غير تابع لعبارة (.)for
مالحظة مهمة جداً :يجب مراعاة عدم نسيان ( ):في نهاية كل من عبارات الشروط والتكرار فهي مهمة جداً وال ينفذ
البرنامج بدونها.
82
83
84
واما لمعرفة كيفية فهم المفسر لعمل عبارة ( )forوكيفية تسلسل تنفيذ عباراتها الداخلية فالمخطط التالي يشرح ذلك
ببساطة:
85
86
87
واالن نفس البرنامج مع إضافة قابلية حساب عدد مرات التكرار للحلقة التكرارية وكما في ادناه:
88
89
90
91
بعد ان شرحنا العبارات المستخدمة في الحلقات التكرارية مثل ( )whileو ( )forنأتي اليوم الى مناقشة مشكلة يوضحها
المثال التالي:
شرحنا في المحاضرة السابقة كيفية إيجاد العدد األكبر من ضمن سلسلة (قائمة او مصفوفة) من االعداد وكما في الصورة
التالية:
وهنا كما هو واضح اعتمدنا على إعطاء قيمة أولية للمتغير األكبر ( )largest_so_farوهي قيمة صغيرة مقدارها سالب
واحد وقد حصلنا على نتائج صحيحة ولكن ماذا لو كانت كل االعداد في القائمة سالبة واصغر من السالب واحد؟
93
مثال اخر على نفس المشكلة :وهو البحث عن اصغر عدد في القائمة وكما في الصورة ادناه:
نفس المشكلة ،ألن القيمة األولية للمتغير ( )smallest_so_farاصغر من كل القيم في القائمة فقد اظهر المفسر نتيجة تقول
بأن األصغر في القائمة هو سالب واحد علما ً ان القائمة ال تحتوي هذا المتغير وهو برنامج خاطيء اخر!
الجواب ببساطة :القيمة االفتراضية ( .)Noneنعم انها كلمة مفتاحية محجوزة في لغة بايثون وتستخدم للتعامل مع هذا النوع
من المشاكل حيث يتم إعطاء قيمة أولية للمتغير هي ( )Noneثم يقوم المتغير بأخذ قيمة اول متغير او ثابت في القائمة او
المصفوفة المراد البحث بداخلها عن األكبر او األصغر وكما في المثال التالي:
94
السطر الرابع :وهو مهم جداً والهدف منه اختبار شرط يتحقق مرة واحدة فقط عند بداية اللوب عندما تكون
( )smallest=Noneفيقوم بأسناد قيمة المتغير األول في القائمة (الذي قيمته االن مخزونة في )valueالى المتغير
( )smallestفي السطر الخامس ثم يبدأ بعدها بالمقارنة.
السطر السادس :عملية المقارنة المتكررة لكل عنصر في القائمة بالمتغير ( )smallestحتى اذا تحقق الشرط ان احد عناصر
القائمة اصغر من ( )smallestفيقوم المتغير ( )smallestبأخذ قيمة ذلك العنصر كما في السطر السابع.
واخيراً السطر الثامن طباعة نتيجة كل حلقة تكرارية قبل البدء بها من جديد والسطر األخير طباعة النتيجة النهائية بعد اكمال
الحلقة التكرارية.
واالن نأخذ مثال على كيفية البحث عن عنصر معين في قائمة بأستخدام القيم المنطقية صح ( )Trueوخطأ (:)False
95
واخيراً في الصورة ادناه مثال محلول عن كيفية استخدام الحلقات التكرارية بشكل احترافي:
96
هذه الدروس وغيرها الكثير تم نشرها في مدونة مصطفى صادق العلمية التي يمكن زيارتها
لالطالع على المزيد على الرابط التالي:
97