تعلم لغة Python الفصل 8 : ال FUNCTIONS الجزء 1

sparrow
0

 



الفصل : 8

الجزء : 1

العنوان : ال FUNCTIONS




في هذا الفصل، ستتعلم كتابة الدوال (functions)، وهي كتل مسماة من التعليمات البرمجية مصممة لأداء مهمة محددة. عندما ترغب في تنفيذ مهمة معينة قمت بتعريفها في دالة، تقوم باستدعاء (call) الدالة المسؤولة عن تلك المهمة. إذا كنت بحاجة إلى تنفيذ تلك المهمة عدة مرات في برنامجك، لن تحتاج إلى كتابة نفس الكود مرة أخرى؛ فقط استدع الدالة المخصصة لتلك المهمة، وسيخبر الاستدعاء بايثون بتنفيذ الكود الموجود داخل الدالة. ستجد أن استخدام الدوال يجعل برامجك أسهل في الكتابة، القراءة، الاختبار، والإصلاح.


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


تعريف الدالة (Defining a Function)


إليك دالة بسيطة باسم `greet_user()` التي تطبع تحية:



هذا المثال يظهر أبسط بنية للدالة. السطر الأول يستخدم الكلمة المفتاحية `def` لإخبار بايثون أنك تعرف دالة. هذا هو تعريف الدالة، الذي يخبر بايثون باسم الدالة، وإذا كان ذلك مناسبًا، بنوع المعلومات التي تحتاجها الدالة لأداء وظيفتها. الأقواس تحتفظ بتلك المعلومات. في هذه الحالة، اسم الدالة هو `greet_user()`، ولا تحتاج إلى أي معلومات لأداء وظيفتها، لذا فإن الأقواس فارغة. (حتى مع ذلك، الأقواس مطلوبة.) أخيرًا، ينتهي التعريف بنقطتين.


أي سطور ذات مسافة بادئة تتبع `def greet_user():` تشكل جسم الدالة. النص في السطر الثاني هو تعليق يسمى docstring، والذي يصف ما تفعله الدالة. عندما ينشئ بايثون توثيقًا للدوال في برامجك، فإنه يبحث عن نص مباشرة بعد تعريف الدالة. هذه النصوص عادة ما تكون محاطة بثلاثة علامات اقتباس، مما يتيح لك كتابة سطور متعددة.


السطر `print("Hello!")` هو السطر الوحيد من الكود الفعلي في جسم هذه الدالة، لذا فإن وظيفة `greet_user()` الوحيدة هي: `print("Hello!")`.


عندما تريد استخدام هذه الدالة، عليك استدعاؤها. استدعاء الدالة يخبر بايثون بتنفيذ الكود الموجود في الدالة. لاستدعاء دالة، تكتب اسم الدالة، متبوعًا بأي معلومات ضرورية بين الأقواس. لأن هذه الدالة لا تحتاج إلى أي معلومات هنا، فإن استدعاء الدالة بسيط مثل إدخال `greet_user()`. كما هو متوقع، فإنه يطبع Hello!:



تمرير المعلومات إلى دالة


إذا قمت بتعديل دالة `greet_user()` قليلاً، يمكنها تحية المستخدم بالاسم. لكي تقوم الدالة بذلك، تدخل `username` في أقواس تعريف الدالة عند `def greet_user()`. بإضافة `username` هنا، تتيح للدالة قبول أي قيمة لـ `username` تحددها. الآن، تتوقع الدالة أن توفر قيمة لـ `username` في كل مرة تستدعيها. عندما تستدعي `greet_user()`، يمكنك تمرير اسم، مثل 'jesse'، داخل الأقواس:


إدخال `greet_user('jesse')` يستدعي `greet_user()` ويعطي الدالة المعلومات التي تحتاجها لتنفيذ استدعاء `print()`. تستقبل الدالة الاسم الذي مررته وتعرض التحية لذلك الاسم:


وبالمثل، إدخال `greet_user('sarah')` يستدعي `greet_user()`، ويمرر الاسم 'sarah'، ويطبع Hello, Sarah! يمكنك استدعاء `greet_user()` بقدر ما تشاء وتمرير أي اسم تريد للحصول على نتيجة متوقعة في كل مرة.


المعاملات والبارامترات (Arguments and Parameters)


في دالة `greet_user()` السابقة، قمنا بتعريف `greet_user()` لتطلب قيمة لمتغير `username`. بمجرد أن استدعينا الدالة وأعطيناها المعلومات (اسم الشخص)، طبعت التحية الصحيحة.


المتغير `username` في تعريف `greet_user()` هو مثال على parameter، وهو جزء من المعلومات التي تحتاجها الدالة لأداء وظيفتها. القيمة 'jesse' في `greet_user('jesse')` هي مثال على argument. الـ argument هو جزء من المعلومات يتم تمريره من استدعاء الدالة إلى الدالة. عندما نستدعي الدالة، نضع القيمة التي نريد أن تعمل الدالة بها داخل الأقواس. في هذه الحالة، تم تمرير الـ argument 'jesse' إلى الدالة `greet_user()`، وتم تعيين القيمة إلى الـ parameter `username`.


ملاحظة:

الناس أحيانًا يتحدثون عن المعاملات (arguments) والبارامترات (parameters) بشكل متبادل. لا تتفاجأ إذا رأيت المتغيرات في تعريف الدالة يُشار إليها كمعاملات أو المتغيرات في استدعاء الدالة يُشار إليها كبارامترات.

 


جربها بنفسك


تمرين 8-1. رسالة: اكتب دالة تسمى `display_message()` تطبع جملة واحدة تخبر الجميع بما تتعلمه في هذا الفصل. استدع الدالة، وتأكد من عرض الرسالة بشكل صحيح.


تمرين 8-2. الكتاب المفضل: اكتب دالة تسمى `favorite_book()` تقبل بارامتر واحد، `title`. يجب أن تطبع الدالة رسالة، مثل "One of my favorite books is Alice in Wonderland". استدع الدالة، وتأكد من تضمين عنوان كتاب كـ argument في استدعاء الدالة.

 


تمرير المعاملات (Passing Arguments)


لأن تعريف الدالة يمكن أن يحتوي على عدة بارامترات، فقد يحتاج استدعاء الدالة إلى عدة معاملات. يمكنك تمرير المعاملات إلى دوالك بعدة طرق. يمكنك استخدام المعاملات الموضعية (positional arguments)، التي يجب أن تكون بنفس الترتيب الذي كتبت به البارامترات؛ المعاملات الكلمة المفتاحية (keyword arguments)، حيث يتكون كل معامل من اسم متغير وقيمة؛ وقوائم وقواميس من القيم. لنلق نظرة على كل من هذه الطرق بالتفصيل.


المعاملات الموضعية (Positional Arguments)


عندما تستدعي دالة، يجب على بايثون مطابقة كل معامل في استدعاء الدالة مع بارامتر في تعريف الدالة. أبسط طريقة للقيام بذلك هي بناءً على ترتيب المعاملات المقدمة. القيم التي تتم مطابقتها بهذه الطريقة تُسمى المعاملات الموضعية.


لرؤية كيف يعمل ذلك، فكر في دالة تعرض معلومات عن الحيوانات الأليفة. الدالة تخبرنا عن نوع الحيوان واسم الحيوان الأليف، كما هو موضح هنا:


يُظهر التعريف أن هذه الدالة تحتاج إلى نوع الحيوان واسم الحيوان الأليف. عندما نستدعي `describe_pet()`, نحتاج إلى توفير نوع الحيوان واسم الحيوان، بهذا الترتيب. على سبيل المثال، في استدعاء الدالة، يتم تعيين المعامل 'hamster' إلى البارامتر `animal_type` والمعامل 'harry' إلى البارامتر `pet_name`. في جسم الدالة، تُستخدم هذان البارامتران لعرض معلومات حول الحيوان الأليف الموصوف.

الناتج يصف هامستر اسمه Harry:



استدعاءات متعددة للدالة


يمكنك استدعاء الدالة بقدر ما تحتاج. لوصف حيوان أليف آخر، مختلف، يتطلب فقط استدعاء آخر لـ `describe_pet()`:


في استدعاء الدالة الثاني، مررنا المعاملات 'dog' و 'willie' إلى `describe_pet()`. كما في مجموعة المعاملات السابقة التي استخدمناها، يقوم بايثون بمطابقة 'dog' مع البارامتر `animal_type` و 'willie' مع البارامتر `pet_name`. كما في السابق، تقوم الدالة بعملها، لكن هذه المرة تطبع قيمًا لكلب اسمه Willie. الآن لدينا هامستر اسمه Harry وكلب اسمه Willie:


استدعاء الدالة عدة مرات هو طريقة فعالة جدًا للعمل. الكود الذي يصف حيوانًا أليفًا يُكتب مرة واحدة


فقط. وبعد ذلك، أي وقت تحتاج فيه إلى وصف حيوان أليف جديد، تستدعي الدالة بـ المعاملات الصحيحة لتوفير المعلومات عن الحيوان الأليف.


ترتيب المعاملات مهم


عند استخدام المعاملات الموضعية، من المهم جدًا أن تكون المعاملات في نفس الترتيب الذي تتوقعه الدالة. إذا وضعت المعاملات بترتيب مختلف، فإن النتائج لن تكون كما تتوقعها:


في هذا الاستدعاء، المعامل 'harry' يتم تمريره إلى البارامتر `animal_type` والمعامل 'hamster' يتم تمريره إلى `pet_name`. تقوم الدالة بعملها كالمعتاد، لكن المعلومات لم تعد صحيحة:


المعاملات الكلمة المفتاحية (Keyword Arguments)


المعامل الكلمة المفتاحية هو زوج اسم-قيمة تقوم بتمريره إلى الدالة. تقوم بربط الاسم والقيمة مباشرةً داخل المعامل، لذا عندما تمرر المعامل إلى الدالة، لن يكون هناك ارتباك (لن ينتهي بك الأمر مع harry يسمى Hamster). المعاملات الكلمة المفتاحية تحررك من القلق بشأن ترتيب المعاملات بشكل صحيح في استدعاء الدالة، وتوضح دور كل قيمة في استدعاء الدالة.


لنعيد كتابة `pets.py` باستخدام المعاملات الكلمة المفتاحية لاستدعاء `describe_pet()`:


الدالة `describe_pet()` لم تتغير. لكن عندما نستدعي الدالة، نخبر بايثون صراحةً بأي بارامتر يجب مطابقة كل معامل معه. عندما يقرأ بايثون استدعاء الدالة، يعرف تعيين المعامل 'hamster' إلى البارامتر `animal_type` والمعامل 'harry' إلى `pet_name`. الناتج يظهر بشكل صحيح أن لدينا هامستر اسمه Harry.


ترتيب المعاملات الكلمة المفتاحية لا يهم لأن بايثون يعرف أين يجب أن تذهب كل قيمة. الاستدعاءات التالية للدالة مكافئة:



ملاحظة:

عندما تستخدم المعاملات الكلمة المفتاحية، تأكد من استخدام الأسماء الدقيقة للبارامترات في تعريف الدالة.

 


القيم الافتراضية


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


على سبيل المثال، إذا لاحظت أن معظم استدعاءات `describe_pet()` تُستخدم لوصف الكلاب، يمكنك تعيين القيمة الافتراضية لـ `animal_type` إلى 'dog'. الآن يمكن لأي شخص يستدعي `describe_pet()` لكلب أن يتجاهل تلك المعلومات:


قمنا بتغيير تعريف `describe_pet()` لتضمين قيمة افتراضية، 'dog'، لـ `animal_type`. الآن عندما تُستدعى الدالة دون تحديد `animal_type`، يعرف بايثون استخدام القيمة 'dog' لهذا البارامتر:



لاحظ أن ترتيب البارامترات في تعريف الدالة كان يجب أن يتغير. لأن القيمة الافتراضية تجعل من غير الضروري تحديد نوع الحيوان كمعامل، فإن المعامل الوحيد المتبقي في استدعاء الدالة هو اسم الحيوان الأليف. لا يزال بايثون يفسر هذا كمعامل موضعي، لذا إذا استُدعي الدالة باسم الحيوان الأليف فقط، سيتطابق ذلك المعامل مع البارامتر الأول المدرج في تعريف الدالة. هذا هو السبب في أن البارامتر الأول يجب أن يكون `pet_name`.


أسهل طريقة لاستخدام هذه الدالة الآن هي توفير اسم الكلب فقط في استدعاء الدالة:


سيكون لهذا الاستدعاء للدالة نفس الناتج كما في المثال السابق. المعامل الوحيد المُقدم هو 'willie'، لذا يتطابق مع البارامتر الأول في التعريف، `pet_name`. لأن لم يُقدم أي معامل لـ `animal_type`، يستخدم بايثون القيمة الافتراضية 'dog'.


لوصف حيوان آخر غير الكلب، يمكنك استخدام استدعاء دالة مثل هذا:



لأن تم توفير معامل صريح لـ `animal_type`، سيتجاهل بايثون القيمة الافتراضية للبارامتر.




ملاحظة:

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

 


استدعاءات الدوال المكافئة


لأن المعاملات الموضعية، المعاملات الكلمة المفتاحية، والقيم الافتراضية يمكن استخدامها معًا، ستجد غالبًا عدة طرق مكافئة لاستدعاء دالة. فكر في التعريف التالي لـ `describe_pet()` مع تقديم قيمة افتراضية واحدة:



مع هذا التعريف، يجب دائمًا تقديم معامل لـ `pet_name`، ويمكن تقديم هذه القيمة باستخدام التنسيق الموضعي أو الكلمة المفتاحية. إذا كان الحيوان الموصوف ليس كلبًا، يجب تضمين معامل لـ `animal_type` في الاستدعاء، ويمكن تحديد هذا المعامل أيضًا باستخدام التنسيق الموضعي أو الكلمة المفتاحية.


كل الاستدعاءات التالية ستعمل لهذه الدالة:


كل من هذه الاستدعاءات للدالة سيكون لها نفس الناتج كما في الأمثلة السابقة.


لا يهم حقًا أي أسلوب استدعاء تستخدم. طالما أن استدعاءات الدالة تنتج الناتج الذي تريده، استخدم الأسلوب الذي تجده أسهل في الفهم.


تجنب أخطاء المعاملات


عند البدء في استخدام الدوال، لا تتفاجأ إذا واجهت أخطاء بشأن المعاملات غير المطابقة. تحدث المعاملات غير المطابقة عندما تقدم عددًا أقل أو أكثر من المعاملات مما تحتاجه الدالة لأداء عملها. على سبيل المثال، إليك ما يحدث إذا حاولنا استدعاء `describe_pet()` بدون أي معاملات:



يتعرف بايثون على أن بعض المعلومات مفقودة من استدعاء الدالة، ويخبرنا traceback بذلك:


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


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


إذا قدمت عددًا كبيرًا جدًا من المعاملات، يجب أن تحصل على traceback مماثل يمكن أن يساعدك في مطابقة استدعاء الدالة بشكل صحيح مع تعريف الدالة.


جربها بنفسك


تمرين 8-3. القميص: اكتب دالة تسمى `make_shirt()` تقبل حجم النص المراد طباعته على القميص. يجب أن تطبع الدالة جملة تلخص حجم القميص والنص المطبوع عليه. استدع الدالة مرة باستخدام المعاملات الموضعية لصنع قميص. استدع الدالة مرة ثانية باستخدام المعاملات الكلمة المفتاحية.


تمرين 8-4. القمصان الكبيرة: عدل الدالة `make_shirt()` بحيث تكون القمصان كبيرة بشكل افتراضي مع رسالة تقول "I love Python". اصنع قميصًا كبيرًا وقميصًا متوسطًا بالرسالة الافتراضية، وقميصًا بأي حجم مع رسالة مختلفة.


تمرين 8-5. المدن: اكتب دالة تسمى `describe_city()` تقبل اسم مدينة وبلدها. يجب أن تطبع الدالة جملة بسيطة، مثل "Reykjavik is in Iceland". اعط البارامتر الخاص بالبلد قيمة افتراضية. استدع الدالة لثلاث مدن مختلفة، على الأقل واحدة منها ليست في البلد الافتراضي.


 


النهاية


نكون هنا انتهينا من الجزء 1 من الفصل 8 من منهج تعلم Python من كتاب python crash course بالعربية 


واذا واجهتك اي مشكلة في الفهم او ما شابه , يمكنك على الفور الذهاب الى المجتمع الخاص بنا في Telegram للمناقشة والتواصل معنا من هنا  


او اذا واجهتك مشكلة في الموقع او تريد اجابة سريعة يمكنك الذهاب الى اخر صفحة في الموقع ستجد صفحة اتصل بنا موجودة يمكنك ارسالة لنا مشكلتك , وسيتم الرد عليها بسرعة جدا ان شاء الله 


ويمكنك الأنضمام الى المجتمع Hidden Lock بالكامل مع جميع قنواته للأستفادة في اخر الأخبار في عالم التقنية وايضا الكتب بالمجان والكورسات والمقالات من خلال الرابط التالي لمجموعة القنوات من     هنا 


يمكنك ايضا متابعتنا في منصات X او Twitter سابقا , لمشاهدة الاخبار والمقالات السريعة والمهمة من  

هنا


وفقط كان معكم sparrow مقدم هذه الشهادة من فريق Hidden Lock 




Tags

إرسال تعليق

0تعليقات

إرسال تعليق (0)

#buttons=(موافق!) #days=(20)

يستخدم موقعنا ملفات تعريف الارتباط لتحسين تجربتك. تاكد الان
Ok, Go it!