/Python: Part(8)

Python: Part(8)

زي ما قولنا في المرة اللي فاتت اننا هنتكلم النهارده عن ال(abstraction) وهنعرف ايه هو  وبيتكلم عن ايه بس خلونا الاول نرجع لنقطة اتعرضنا ليها في المقالة اللي فاتت في المناقشات وهي الطرق التانية اللي ممكن نعمل بيها ال(loops) في البايثون .

المرة اللي فاتت اتكلمنا عن ال(loops) واتكلمنا عن انواعها واتكلمنا عن الطرق الاساسية او بمعنى ادق احنا اتكلمنا عن الطرق المبدأية  لعمل ال(loops) . بس طبعا فيه طرق كتيرة ومبتكرة نقدر من خلالها اننا ننفذ فكرة ال(loop) في البايثون.

ولعدم اطالة الحديث في النقطة دي .. تقدروا تشوفوا الطرق التانية في الكومنتات في المقالة اللي فاتت    Python: Part(7)

نيجي بقى لموضوع النهارده 🙂

 

Abstraction

 

مصطلح ال(abstraction) بيعني في اللغة العربية “التجريد” .. طيب يعني ايه التجريد في البايثون ؟

التجريد يعني اخفاء التفاصيل اللي غير المهمة اوي في الكود بتاعي… بهدف اختصار الكود عشان انا هدفي زي ما قلنا قبل كدا اني اكتب كود بسيط ومنظم و’صغير’ طيب هنعمل ايه وهنطبق الطريقة دي ازاي ؟ . هنعمل الموضوع دا عن طريق ال(function) . وال(function) عبارة مجموعة اوامر بتعمل حاجة معينة في البرنامج. ونقدر نعرّف الدوال بالطريقة دي ()def function وكل دالة بتاخد (parameter). طيب انا اقدر ازاي اتواصل ما الدالة ؟

ال(function) بتستقبل الحجات اللي مطلوبة عشان تشتغل في هيئة (parameters) . عندنا نوعين من ال (parameters) وهم :

1- positional parameters

2- keyword parameters

 Create new function

كلام حلو لحد دلوقتي .. طيب تعالوا نشوف الكلام بيتطبق ازاي في الكود ، وازاي هنعرف الدوال وازاي هنستخدمها  ، نشوف مثال الاول ونرجع نشرحه واحدة واحدة:

ملحوظة : في الامثلة هنستخدم ال(ipython)

في المثال اللي فات  دا احنا استدخدمنا (def)  عشان نعرف دالة جديدة اسمها ()Hello  وبعد كدا حددنلها ال(parameter) بتاع الدالة وسميناه (name) .

والخرج بتاع الكود دا هيكون عبارة عن الاتي :


 

طيب ناخد مثال تاني:

في المثال دا احنا عملنا حاجة كدا في السطر الاول .. بص عليها تاني كدا …في حاجة غريبة صح ؟

الحركة دي معناتها ان ال(lastname) دا اختياري ممكن نحطه او ممكن نسيبه زي ما هو . والوضع الافتراضي بتاعه انه فاضي ، فكدا كدا مش هيتأثر .

واستخدمنا هنا طريقة ال(String Substitution ) ودي اتعلمناها قبل كدا واستخدمناها اكتر من مرة . والخرج بتاع الكود دا هيكون عبارة عن الاتي :

هنلاحظ هنا انا دخلنا متغير واحد للبرنامج واتعامل معاه عادي جدا

والمرادي دخلنا متغيرين للبرنامج وبردو اتعامل عادي .. ودا عشان احنا مخليين المتغير التاني اخيتاري مش مجبر اني ادخله للبرنامج ولو دخلته هيبقى عادي بردو.

Documenting Functions :

نيجي لنقطة مهمة وفيها هنعمل توضيح وتعريف بمهام الدالة اللي احنا عاملينها جديد . وهنوضح يعني ايه الكلام دا بالمثال التالي :

طيب كدا انا عرّفت مهام الدالة . لو حبيت استعرضها بقى بكتب magic method اسمها (__doc__)

زي ما في المثال كدا :

The magic of parameters !

في الجزء دا هنعيد الكلام اللي فوق بس بطريقة تانية .. ازاي ؟ .هنعرف دالة وظيفتها انها تاخد (parameter) وتغير في (list) مثلا زي المثال دا كدا :

هنا احنا عرّفنا الدالة اللي اسمها change(n) واديتها (parameter) اسمه n وقولتله ان  وظيفة الدالة دي انها تشوف اول عنصر في ال(list) او اي (sequence) هتجيلك بس بشرط طبعا انها تكون قابلة للتعديل . عشان زي ما احنا عارفين ان فيه انواع من المتتاليات غير قابة للتعديل زي ال(tuple) مثلا .  وتغيره وتخليه يبقى

‘Mr. Gumby’

وخرج الكود دا هيبقى الاتي :

Nested scopes:

وفى الحالة دي من الممكن اننا نكتب دالة بداخل دالة  تانية .يعني زي ما بنعمل في الرياضيات كدا -تركيب الدوال- والمثال اللي جاي بيوضح معنى الكلام دا كله :

فى هذه الحالة (3) يعبر عن قيمة (x)

فى هذه الحالة (4) يعبر عن قيمة (a)

والخرج بتاع الكود دا هيكون :

Recursion:

الاول عاوزين نعرف يعني يه (Recursion) . هي دالة بتستدعي نفسها كذا مرة بس لازم يتوفر شرطين اساسيين ومهمين جدا في العملية دي :

الاول : لازم الدالة تعرف ايه هو شرط التوقف اللي لو اتحقق مش هتستدعي نفسها تاني .

التاني : وجود الحالة التكرارية اللي بتمكننا من استدعاء الدالة مرة تانية .

تعالوا نشوف مثال على الكلام دا :

ودا هيكون الخرج بتاع الكود فرضا ان الرقم اللي عاوزين نطبق عليه الكود هو 5 مثلا

Shadowing:

هنا هنشوف حاجة جميلة جدا . شوف المثال اللي جاي هتلاحظ ان فيه متغيريين اتنين ،الاول (local) والتاني (global) والاتنين لهم نفس الاسم اللي هوا (name) .

كدا هيبقى في مشكلة . لاننا مش هنعرف نفرق بين كل واحد فيهم، وعشان نحل المشكلة دي هنستخدم ميثود اسمها (global) ودي بترجع المتغيرات من النوع (global) ، وكدا نقدر نفرق بين الاتنين .

ناخد مثال على الكلام دا :

في المثال اللي فات دا احنا علمنا متغير وسميناه باسم معين وعملنا متغير تاني بنفس الاسم بردو بس الفرق ان المتغير الاولاني احنا عرفناه في ال(global) والمتغير التاني كان في دالة يعني هيبقى (local) وزي ما قولنا عشان نتفادى اللخبطة كتبنا السطر دا print globals()[‘name’], name  وبكدا يبقى فرقنا بين المتغيريين . وبعد كدا الكود هيمشي عادي وهينفذ الدالة اللي عرّفناها واللي هتعمل دمج الاسمين مع بعض . ويكون الناتج زي ما هو واضح في المثال بالظبط .

Lambda expression:

 

هنا هنعمل حاجة جديدة وغريبة في نفس الوقت . هنعرف دالة على الطاير. يعني ايه ؟ 🙂

يعني هعرف دالة كدا في النص كدا بدون ما حد ياخد باله . وبدون ما نستخدم (def) وبدون ما اديها اسم . وفي سطر واحد بس ، بستخدم ميثود اسمها (lambda) وميثود اسمها (mab) في المثال اللي جاي دا توضيح للكلام اللي فات :

المثال دا بيبين ازاي نستخدم الميثودس اللي قولنا عليها دي في اننا نطلع نتايج عملية التربيع للارقام اللي في ال(list) اللي هو عاوزها:

في المثال دا البرنامج هيمشي على ال(list) كلها بداية من ال[0]index  لحد اخر عنصر .. وهيطبق عليهم المعادل x**2 ويخزن نتيجة تربيع العنصر الاول بنفس ال(index) الاصلي بتاعه .

 

كفايا كدا النهاردة .. ونكمل المرة الجاية ان شاء الله … تابعونا ،،،