الدوال في بايثون: كيف تكتب دالة وتعيد استخدامها

35 دقيقة تقريبًا

ما تحتاج أن تعرفه قبل هذا الدرس
  • Variables
  • Strings and basic data types
  • Lists
  • Dictionaries
  • Conditions
  • for loops
  • while loops
  • break
  • continue
  • set
ما يضيفه هذا الدرس
  • Function
  • def
  • Function call
  • Parameter
  • Argument
  • return

يحسب العدّاد في الأعلى تمارين الدرس، وعددها 8، أما القراءة وتشغيل الأمثلة فلا تُحتسب.

المشكلة التي تحلها Functions

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

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

الـ Function تسمح لنا أن نضع مجموعة تعليمات تحت اسم واحد، وبعد ذلك نشغل هذه التعليمات كلما احتجنا إليها باستخدام هذا الاسم.

ما هي Function

الـ Function هي مجموعة تعليمات نعطيها اسمًا، ولا يتم تنفيذ هذه التعليمات عند تعريفها فقط، بل يتم تنفيذها عندما نستدعي Function.

أنت استخدمت Functions جاهزة من قبل مثل print، فعندما تكتب print أنت تطلب من Python تشغيل Function موجودة بالفعل.

في هذا الدرس سنبدأ بإنشاء Functions خاصة بنا.

كيف نكتب Function

القاعدة
  • نبدأ بكلمة def، وهي تخبر Python أننا سنعرّف Function جديدة.
  • بعد def نكتب اسم Function.
  • بعد الاسم نكتب قوسين ().
  • بعد القوسين نكتب :.
  • السطر أو السطور الموجودة داخل Function يجب أن تكون داخلة بمسافة Indentation، لأن Python يحتاج أن يعرف أي تعليمات تنتمي إلى Function.
مثال
الناتج المتوقع
Hello
ليه طلع كده؟
  1. 1Python يقرأ def say_hello() ويعرف أن هناك Function اسمها say_hello.
  2. 2السطر print الموجود بالداخل لا يتم تنفيذه لحظة تعريف Function.
  3. 3بعد ذلك يصل Python إلى say_hello().
  4. 4هنا نحن نستدعي Function.
  5. 5Python يدخل إلى Function وينفذ print("Hello").
  6. 6لذلك يظهر Hello في الناتج.

التعريف وحده لا يشغل Function

مثال
الناتج المتوقع
Function created
ليه طلع كده؟
  1. 1تم تعريف say_hello.
  2. 2لكننا لم نكتب say_hello() بعد التعريف.
  3. 3لذلك التعليمات داخل Function لم تعمل.
  4. 4السطر الوحيد الذي تم تنفيذه هو print("Function created").

توقع النتيجة

توقّع الناتج

قبل تشغيل الكود، توقع كم مرة ستظهر جملة Checking page.

ليه طلع كده؟
  1. 1تم تعريف Function مرة واحدة.
  2. 2بعد ذلك تم استدعاؤها مرتين.
  3. 3كل استدعاء ينفذ التعليمات الموجودة داخل Function من البداية.
  4. 4لذلك تظهر الجملة مرتين.

ما هو Parameter

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

الـ Parameter هو اسم متغير نكتبه داخل تعريف Function حتى تستطيع Function استقبال قيمة عند تشغيلها.

القيمة التي نرسلها عند استدعاء Function تسمى Argument.

Parameter وArgument بمثال بسيط

جرّب بنفسك — غيّر وشغّل
الناتج المتوقع
Hello Islam
Hello Sara
ليه طلع كده؟
  1. 1عند تعريف greet كتبنا name داخل القوسين، لذلك name هو Parameter.
  2. 2في الاستدعاء الأول أرسلنا القيمة Islam، لذلك Islam هي Argument.
  3. 3داخل Function أصبحت قيمة name هي Islam فظهر Hello Islam.
  4. 4في الاستدعاء الثاني أرسلنا Sara.
  5. 5تغيرت قيمة name في هذا الاستدعاء فقط إلى Sara فظهر Hello Sara.

تمرير URL إلى Function

مثال SEO — جرّب تغيّر الروابط وشغّل
الناتج المتوقع
Checking: https://example.com/
Checking: https://example.com/about
ليه طلع كده؟
  1. 1Function اسمها show_url وتستقبل Parameter اسمه url.
  2. 2في الاستدعاء الأول أخذ url قيمة الصفحة الرئيسية.
  3. 3تم طباعة Checking ثم قيمة url.
  4. 4في الاستدعاء الثاني أخذ url قيمة صفحة about.
  5. 5نفس Function عملت على صفحتين مختلفتين من غير أن نكرر منطق الكود.

Function يمكن أن تستقبل أكثر من Parameter

يمكن للـ Function استقبال أكثر من قيمة، وفي هذه الحالة نكتب أكثر من Parameter داخل القوسين ونفصل بينهم بفاصلة.

وعند استدعاء Function نرسل القيم بنفس الترتيب.

مثال
الناتج المتوقع
URL: https://example.com/
Status: 200
ليه طلع كده؟
  1. 1Function تستقبل url وstatus.
  2. 2القيمة الأولى التي أرسلناها ذهبت إلى url.
  3. 3القيمة الثانية 200 ذهبت إلى status.
  4. 4بعد ذلك تم تنفيذ سطري print باستخدام القيم التي استقبلتها Function.

الفرق بين print وreturn

print تعرض قيمة على الشاشة فقط.

أما return فتعيد قيمة من Function إلى المكان الذي استدعاها.

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

أول مثال على return

مثال
الناتج المتوقع
200
ليه طلع كده؟
  1. 1تم تعريف get_status.
  2. 2عندما استدعينا get_status() دخل Python إلى Function.
  3. 3وصل إلى return 200 فأعادت Function القيمة 200.
  4. 4تم تخزين القيمة التي عادت في المتغير page_status.
  5. 5بعد ذلك طبعنا page_status فظهر 200.

return مع Parameter

جرّب بنفسك — غيّر وشغّل
الناتج المتوقع
True
False
ليه طلع كده؟
  1. 1في الاستدعاء الأول أصبحت قيمة status هي 200.
  2. 2Python فحص الشرط status == 200 وكانت النتيجة True.
  3. 3return أعادت True وتم تخزينها في result ثم طباعتها.
  4. 4في الاستدعاء الثاني أصبحت status تساوي 404.
  5. 5الشرط 404 == 200 نتيجته False.
  6. 6return أعادت False ولذلك ظهر False.

Function تتخذ قرارًا بسيطًا

مثال SEO — غيّر الأرقام وشغّل
الناتج المتوقع
OK
Check page
ليه طلع كده؟
  1. 1في الاستدعاء الأول وصلت القيمة 200 إلى status.
  2. 2الشرط status == 200 تحقق.
  3. 3تم تنفيذ return "OK".
  4. 4في الاستدعاء الثاني وصلت 404.
  5. 5الشرط لم يتحقق، لذلك انتقل Python إلى else.
  6. 6تم تنفيذ return "Check page".

استخدام Function داخل Loop

مثال SEO — الدرس الرابع + الخامس مع بعض
الناتج المتوقع
Checking: https://example.com/
Checking: https://example.com/about
Checking: https://example.com/contact
ليه طلع كده؟
  1. 1لدينا List تحتوي على ثلاثة URLs.
  2. 2عرّفنا Function اسمها check_url وتستقبل URL واحدًا.
  3. 3بدأ for loop وأخذ أول URL من القائمة.
  4. 4تم إرسال هذا URL إلى check_url فتمت طباعته.
  5. 5عاد Loop وأخذ URL الثاني وشغل نفس Function.
  6. 6تكرر الأمر مع URL الثالث.
  7. 7هنا Loop مسؤولة عن المرور على الصفحات، وFunction مسؤولة عن العمل الذي نريد تنفيذه على كل صفحة.

مثال SEO جامع

Function + Loop + Condition في Workflow واحد
الناتج المتوقع
https://example.com/ -> OK
https://example.com/about -> OK
https://example.com/old-page -> Check status
ليه طلع كده؟
  1. 1لدينا List اسمها pages، وكل عنصر داخلها Dictionary يحتوي على url وstatus.
  2. 2Function اسمها audit_page وتستقبل صفحة واحدة.
  3. 3داخل Function نفحص قيمة status.
  4. 4إذا كانت 200 نطبع URL ومعها OK.
  5. 5إذا لم تكن 200 نطبع URL ومعها Check status.
  6. 6for loop تمر على كل Dictionary داخل pages.
  7. 7في كل دورة ترسل الصفحة الحالية إلى audit_page.
  8. 8بهذا فصلنا مسؤوليتين، Loop تمر على البيانات، وFunction تنفذ الفحص على كل صفحة.

أكمل الكود

أكمل الكود

أكمل الفراغات حتى تنشئ Function تستقبل URL وتطبعه.

اكتشف الخطأ

صلّح الخطأ

الكود التالي يحتوي على خطأ في Indentation، أصلحه ثم شغله.

راجع فهمك

اختبر فهمك

متى يتم تنفيذ التعليمات داخل Function؟

اختبر فهمك

ما الفرق الأساسي بين print وreturn؟

الخلاصة

Function تسمح لك بوضع مجموعة تعليمات تحت اسم واحد ثم إعادة استخدامها.

نستخدم def لتعريف Function، لكن Function لا تعمل إلا عند استدعائها.

Parameter هو الاسم الذي تستقبل من خلاله Function البيانات، وArgument هي القيمة الفعلية التي نرسلها عند الاستدعاء.

print تعرض النتيجة، بينما return تعيد قيمة يمكن تخزينها أو استخدامها في جزء آخر من الكود.

عند دمج Functions مع Loops وConditions نبدأ في بناء Workflow حقيقي بدل كتابة تعليمات منفصلة ومكررة.

اختبار الدرس الخامس

ملحوظة
الناتج مخفي لحد ما تحل. تقدر تشغّل الكود، وتطلب تلميح بعد أول محاولة، والحل الكامل بيظهر بعد محاولتين.

السؤال الأول

توقّع الناتج

توقع الناتج قبل تشغيل الكود.

السؤال الثاني

تحدّي SEO

اكتب Function بترجّع نتيجة

اكتب Function اسمها page_result تستقبل status، إذا كانت 200 تعيد OK، وفي غير ذلك تعيد Check، ثم اطبع نتيجة استدعائها بالقيمة 404.

السؤال الثالث

تحدّي SEO

Function جوه Loop

لديك قائمة URLs، أنشئ Function اسمها show_url تستقبل URL واحدًا وتطبعه، ثم استخدم for loop لتشغيل Function على كل URL في القائمة.

بقيت تمارين لم تحلّها

0/8

التمارين المتبقية: 8 من 8. يُحتسب الدرس مكتملًا حين تحلّها كلها، ويمكنك العودة إليها متى شئت.

أحسنت، وصلت إلى نهاية الدرس.