يناير 07، 2010

سلسلة بايثون للمبتدئين - 05

في البداية آسف إن تأخرت عن تكملة هذه السلسلة التعليمية الخاصة ببايثون للمبتدئين. اليوم سنتعلم إستخدام الحلقات (loops) و الجملة الشرطية (If)، لن يأخذ ذلك منا الكثير من الوقت و سيكون ممتعا.

المقدمة:

أولا، ما معنى الحلقات في البرمجة و ما الفائدة منها؟
قبل تعريف الحلقات و دورها/وظيفتها علينا أن نتذكر أننا نبرمج حتى يسهل علينا التعامل مع المعلومات، تخزينها و تحليلها بشكل سريع و دقيق. الكثيرون ينظرون إلى البرمجة على أساس أنها وسيلة لإيجاد الحلول للمشاكل الحسابية و المعلوماتية أو حتى المشاكل اليومية البسيطة.

الحلقات كما نفهم من خلال التسمية تعني أن كود برمجي ما سيتكرر لعدد من المرات.

لماذا سيتكرر الكود أكثر من مرة؟
لنتصور مع بعض أننا على وشك أن نقوم بطبع كشف حساب أجرة مجموعة من الموظفين في آخر الشهر؛ و مع العلم أن أجرة كل موظف قد تختلف عن الآخر (نظرا للرتبة أو عدد ساعات العمل و الغياب) فإنه على العموم سيكون هنالك تشابه كبير بينهم لأننا سنقوم بنفس العملية لكل موظف.

و مثال آخر هو أن يطلب منا إعداد نتائج الطلاب السنوية أو الدورية. تصور حجم التكرار و المجهود و التركيز حتى ننجز هذه المهمة يدويا، في الوقت الذي يمكننا كتابة كود مصدري يشبه التالي: "في كل مستوى من مستويات المدرسة قم بإخراج نتيجة كل طالب من الطلاب المسجلين بإستخدام الشكل التالي مع مراعات تفاصيل كل طالب".

=> تذكر جيدا أن الحلقات تجعل من الروتين و المهام الروتينية أمرا سهلا و غايتا في البساطة و السلاسة.

أكمل بقية الموضوع


الحلقات في بايثون:
هنالك نوعين فقط من الحلقات في بايثون:
  • الحلقة التسلسلية for
  • الحلقة الشرطية while
الحلقات التسلسلية:

كما يتضح من التسمية فإن هذا النوع من الحلقات يتسلسل (يمشي من بداية سلسلة ما حتى نهايتها).

ما نوع هده السلسلة؟
قد يكون أي شيء، حروف، أرقام، كلمات، جمل، كائنات، أي شيء. المهم أن تكون على شكل سلسلة يمكن القيام بالتدرج (iteration) عليها.

مثال:
for n in range(5, 15):
    print n

الشرح:
لتذكير فقط فإن for و in من الكلمات المفتحية المحجوزة لبايثون. for تعني لكل  و in تعني من.
range عبارة عن دالة (سنرى الدوال في التدوينة اللاحقة) تقوم بإنشاء سلسلة تبدأ من المعيار الأول (5) و تنتهي مع المعيار الثاني (15). لاحظ معي جيدا قلت "مع" وليس "في" المعيار الثاني. بمعنى أن السلسلة التي سيتم تكوينها/إنشائها ستكون كما يلي:
[5, 6, 7, 8, 9, 10, 11, 12, 13, 14]

n ستكون المتغيرة التي ستأخذ القيمة التالية في كل دورة/تدرج من دورات على  السلسلة. ستتغير قيمة n في كل دورة

إدا أعدنا صياغة هذه الحلقة بلغتنا فسكون كما يلي :
لكل قيمة معبر عنها بـ ن من قيم السلسلة التالية (5 إلى حدود 15):
    إطبع قيمة ن

المثال الثاني:
names = ["Ayman", "Bashar", "Karim"]
for name in names:
    print "Hi!, " + name

في السطر الاول قمنا بتحديد قائمة بالأسماء المذكورة.
بعدها كتبنا حلقة تسلسلية for ستستخدم المتغيرة name للتعبير عن كل قيمة من قيم القائمة names. و في كل دورة يتم عرض قيمة المتغيرة name بعد ربطها بالجزء "Hi!, ".
و بذلك نكون قد قمنا بعرض رسالة تحية لكل شخص.

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


الحلقات الشرطية:

أحيانا لا نكون متأكدين من عدد الدورات أو لا نستطيع توقع متى ستنتهي الحلقة. و في مثل هده الحالات الحلقة التسلسلية for لا تعيننا جيدا و قد تعقد فهم الكود البرمجي.

حتى نفهم أكثر سأقدم مثال:
لنفترض أننا سنصمم لعبة لسباق السيارات; للتحكم في اللعبة سنستخدم مفاتيح الإتجاهات (فوق، تحت، يمين، يسار). عند بداية اللعب تبدأ السيارة بالتحرك و نستمر باللعب حتى نكتفي من اللعب :) . السؤال هو متى سننتهي من اللعب؟ كيف سنجعل من هذا البرنامج (لعبة سباق السيارات) الذي صممناه يتوقف حتى يكتفي المستخدم من اللعب؟

إذا كان مثال لعبة سباق السيارات غير واضح لدى البعض سأقدم مثال آخر بخصوص تصميم برنامج للتحكم في تكيف الغرف. المطلوب منا هو تصميم برنامج يتحكم بتكيف غرفة حتى يصبح جوها معتدل. كيف سنعلم متى سيصبح جو الغرفة معتدلا؟ لا سبيل لمعرفة ذلك. إدن الكود البرمجي عليه أن يستمر بالعمل حتى يصبح الجو معتدل و بعدها يتوقف.

في مثل هذه الحالات نجد الحلقات الشرطية while كحل مناسبا لمشكلتنا.

لماذا تسمى بالحلقات الشرطية؟
لأن مثل هذه الحلقات لا تتوقف عن الدوران حتى يصبح الشرط خاطئا/غير صحيح.

مثال:
i = 0
while i < 10:
    i = i + 1
    print i

print "Goodbye!"


الشرح:
في البداية قمنا بالتعريف بالمتغيرة i من خلال تحديد قيمتها بـ 0
ثم حلقة شرطية (while) طلبنا منها أن تقوم بزيادة 1 على القيمة السابقة لـ i و من ثم عرض قيمة i ما دامت قيمة i أصغر من 10 أو بمعنى آخر نفد ما طلبناه منك ما دام الشرط قائما.
قبل أن تدخل while في  الدورة التالية تتأكد أولا من أن الشرط صحيح بمعنى أن قيمة i ما زالت أصغر من 10
و بعد أن يصبح الشرط خاطئا (False) تتوقف الحلقة و يتابع البرنامج عمله، أي يعرض رسالة Goodbye! كما هو في مثالنا.

هنالك حالات أخرى نستخدم فيها break حتى ننهي الحلقة يدويا، أو نجبرها على تخطي الدورة الحالية لتمر إلى أخرى بإستخدام continue. إليكم المثالين التاليين:

مثال 1:
i = 0
while i < 10:
    i = i + 1
    if i > 5:
        break
    print i

print "Goodbye!"

في هذا المثال ستتوقف الحلقة بعد عرض العدد 5

مثال 2:
i = 0
while i < 10:
    i = i + 1
    if i < 5:
        continue
    print i

print "Goodbye!"

في هذا المثال لن تعرض إلا الست الأرقام الاخيرة 5,6,7,8,9,10


الجملة الشرطية في بايثون:

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

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

قبل أن أعطي مثال جديد، رأينا قبل لحظة مثالين للجملة الشرطية if مستخدمة مع break و continue.

مثال:

age = int(raw_input("Your age please: "))
if age < 40:
    print "You are pretty young."
else:
    print "You are a little bit old."

في البداية نطلب من المستخدم إدخال عمره. سيتعامل بايثون مع القيمة المدخلة على أساس أنها من نوع نصي (string) لذلك يستوجب علينا تحويلها إلى صيغتها العددية (integer)
بعدها تقوم الجملة الشرطية if بالتحقق من أن قيمة المتغيرة age أصغر من 40، و إدا كان هذا الشرط صحيحا سيعمل الكود في الجزء (block) الذي يلي سطر الجملة الشرطية. بمعنى أنه سيتم عرض رسالة "You are pretty young."
أما (المعبر عنها بـ else) إدا لم يتحقق الشرط (بمعنى أن العمر المدخل أكبر من أو يساوي 40) فسيتم عرض الرسالة الأخرى "You are a little bit old."

لاحظ معي جيدا، جزء واحد فقط (block) من الجزئين سيعمل، بمعنى أنه إدا عمل أحدهما لن يعمل الآخر.

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

age = int(raw_input("Your age please: "))

if age < 5:
    print "You really shouldn't be here."
elif age >= 5 and age <= 14:
    print "Go get your homework done!"
elif age >= 15 and age <= 30:
    print "You'r pretty young."
elif age > 30 and age < 50:
    print "These are your golden moments in life."
elif age > 50:
    print "Still a lot of things to learn."
else:
    print "Are you from planet earth?"

في هذا المثال قمنا بما يلي:
تتحقق الجملة الشرطية if من أن قمية المتغيرة age أصغر من 5. إدا كانت كذلك سيتم عرض الرسالة الأولى.
أما إدا لم يتحقق الشرط السابق فسيتم التحقق من الشرط التالي من خلال elif. إدا تحقق هد الأخير يتم عرض الرسالة الخاصة به، و إدا لم يكن كدلك ننتقل للتأكد من الشرط الذي يتبعه و هكذا حتى نستنفد كل الشروط. و في نهاية إما أن يكون قد تحقق أحد الشروط و إما يتم تنفيذ الجزء الخاص بـ else.


الآن لم يتبقى لنا إلا تدوينة واحدة حتى نكمل هذه السلسلة ستخصصها للدوال (functions) و الأقسام (Classes).

ليست هناك تعليقات:

إرسال تعليق