cb
codebamin
الفصل 9 · الدوال البرمجية (Functions)

تعريف الدوال البرمجية (def)

رأيت من قبل كيف تستدعي دوال مثل print() وlen(). الآن ستتعلم كيف تكتب دوالك الخاصة بحيث تستطيع أنت أو غيرك استخدامها. تصبح هذه الفكرة شديدة الأهمية كلما كبر البرنامج وزاد تعقيده.

إليك مثالًا بسيطًا:

__program_indented__

هذا الكود يعرّف دالة اسمها greet تستقبل معاملًا واحدًا. وبعد تعريف الدالة نستدعيها مرتين. شغّل الكود ولاحظ ما يحدث.

تعريف الدالة عبارة مركبة (compound statement). وكما في if وfor، يبدأ بسطر رأس (header) ثم جسم مزاح إلى الداخل يمكن أن يحتوي على تعليمة واحدة أو أكثر.

أضف تعليمة أخرى إلى الدالة حتى تصبح هكذا:

def greet(name): print(f"Hello {name}!") print("How are you?")

ثم شغّل البرنامج مرة أخرى.

لاحظ كيف تغيّر ناتج البرنامج. أصبحت How are you? تُطبع مرتين. يمكنك التفكير في البرنامج كله كما لو كان مكافئًا تقريبًا لما يلي:

name = "Alice" print(f"Hello {name}!") print("How are you?")

name = "Bob" print(f"Hello {name}!") print("How are you?")

وهذا يوضح واحدة من أهم فوائد الدوال: يمكنك إعادة استخدام الكود نفسه مرات عديدة من دون تكرار كتابته. الأمر يشبه كتابة برنامج صغير داخل برنامج أكبر.

سطر رأس تعريف الدالة يحتوي دائمًا على هذه الأجزاء:

  1. الكلمة المحجوزة def ثم مسافة.
  2. اسم الدالة. يشبه اسم المتغير: يمكنك اختيار الاسم، مع وجود قيود مثل عدم احتوائه على مسافة.
  3. قوسان ( و).
  4. صفر أو أكثر من أسماء المعاملات بين القوسين، مفصولة بفواصل إذا كان هناك أكثر من معامل. هنا لدينا معامل واحد اسمه name.
  5. النقطتان :.

لنجرّب تمرينًا بسيطًا. غيّر اسم الدالة من greet إلى say_hello. يجب أن يظل البرنامج كله يعمل بالطريقة نفسها، ولا تغيّر أي شيء آخر.

جيد! الآن طبّق فكرة مشابهة: غيّر اسم المعامل من name إلى person_name.

تذكّر أن تغيير اسم المعامل في رأس الدالة وحده لا يكفي إذا كان جسم الدالة ما زال يشير إلى الاسم القديم. عدّل كل المواضع اللازمة فقط، واترك استدعاءات say_hello("Alice") وsay_hello("Bob") كما هي.

أحسنت!

اكتب الآن دالة خاصة بك اسمها print_twice تستقبل معاملًا واحدًا x وتطبع هذا المعامل مرتين، كل مرة في سطر منفصل.

مثلًا، الاستدعاء print_twice("Hello") يجب أن يطبع:

Hello Hello

يمكنك اختبار الدالة باستدعائها بعد تعريفها، لكن ذلك ليس مطلوبًا ضمن تعريف الدالة نفسه.

يمكن أن تستقبل الدالة أكثر من معامل واحد. جرّب المثال التالي:

__program_indented__

راقب كيف تُستخدم القيم الممررة عند استدعاء الدالة داخل جسمها.

لاحظ الفواصل التي تفصل المعاملات في تعريف الدالة، والفواصل التي تفصل الوسائط عند الاستدعاء، والعلاقة بين ترتيب الطرفين:

def print_many(thing, n): ^ ^ | | print_many("Hello", 3)

لذلك يمكن التفكير في print_many("Hello", 3) كما لو أنه يؤدي في بداية الاستدعاء إلى:

thing = "Hello" n = 3 for _ in range(n): print(thing)

في هذا التمرين، بدّل ترتيب المعاملات في رأس تعريف الدالة ليصبح:

def print_many(n, thing):

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

ممتاز! لديك الآن أساس قوي لفهم كيفية تعريف الدوال في بايثون.

solution.py
1
2
3
4
5
6
7
8
9
10
الطرفية (shell)
>>>