تخطَّ إلى المحتوى

الدوال في Python (Functions)

الدرس 14 من 25 · Python

كلما كبر برنامجك، ستجد أنك تكرر نفس الأسطر في أماكن مختلفة. الدوال (Functions) تحل هذه المشكلة: تكتب الكود مرة واحدة، وتعطيه اسماً، وتستخدمه متى شئت. في هذا الدرس ستتعلم كيف تنشئ دوالك الخاصة، وتمرر لها البيانات، وتأخذ منها النتائج.

الدالة تُنشأ بالكلمة def (اختصار define أي «عرِّف»)، ثم اسمها، ثم قوسان ونقطتان، ثم الكود المُزاح:

def greet():
print("أهلاً بك في مدرسة البرمجة!")
greet()
greet()
الناتج
أهلاً بك في مدرسة البرمجة!
أهلاً بك في مدرسة البرمجة!

هنا خطوتان:

  1. التعريف بـ def: يكتب «الوصفة» فقط، ولا يُنفّذ شيئاً.
  2. الاستدعاء بكتابة الاسم والقوسين greet(): هنا يُنفّذ الكود.

الدالة مثل وصفة طبخ في كتاب: تكتبها مرة واحدة، وتطبخ منها كلما أردت.

المعاملات: أعطِ الدالة بيانات

Section titled “المعاملات: أعطِ الدالة بيانات”
def greet_user(name):
print(f"أهلاً يا {name}")
greet_user("مريم")
greet_user("يوسف")
الناتج
أهلاً يا مريم
أهلاً يا يوسف

name معامل (Parameter): خانة فارغة تُملأ عند الاستدعاء. والقيمة التي تمررها مثل "مريم" تسمى وسيطاً (Argument).

إذا نسيت أن تمرر الوسيط المطلوب، تخبرك Python بوضوح:

greet_user()
الناتج
TypeError: greet_user() missing 1 required positional argument: 'name'

الدالة تستطيع أن تحسب شيئاً وتعطيك النتيجة لتستخدمها:

def add(a, b):
return a + b
result = add(4, 6)
print(result)
print(add(10, 20) * 2)
الناتج
10
60

تخيّلها مثل آلة العصير: تضع فيها الفاكهة (المعاملات)، فتخرج لك كوب العصير (القيمة المرجعة). وعندما تصل Python إلى return تخرج من الدالة فوراً:

def check_age(age):
if age < 13:
return "عذراً، الموقع لمن هم 13 سنة فأكبر"
return "مرحباً بك!"
print(check_age(10))
print(check_age(16))
الناتج
عذراً، الموقع لمن هم 13 سنة فأكبر
مرحباً بك!

إذا لم تكتب return، تُرجع الدالة None:

def double(n):
n * 2
print(double(4))
الناتج
None

ميزة جميلة في Python: يمكنك إرجاع عدة قيم مفصولة بفواصل، وتصل على شكل صف يمكنك فكّه:

def min_max(numbers):
return min(numbers), max(numbers)
low, high = min_max([4, 9, 1, 7])
print(low, high)
الناتج
1 9

القيم الافتراضية والوسائط المسماة

Section titled “القيم الافتراضية والوسائط المسماة”

يمكنك أن تعطي المعامل قيمة افتراضية تُستخدم إذا لم يُمرَّر:

def power(base, exp=2):
return base ** exp
print(power(5))
print(power(2, 3))
print(power(exp=3, base=2))
الناتج
25
8
8

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

المتغيرات المحلية والعامة

Section titled “المتغيرات المحلية والعامة”

المتغير الذي تنشئه داخل الدالة يعيش داخلها فقط:

site = "مدرسة البرمجة"
def show():
page = "الرئيسية"
print(site, "-", page)
show()
print(page)
الناتج
مدرسة البرمجة - الرئيسية
NameError: name 'page' is not defined
  • site عام (Global): معرّف خارج أي دالة، ويمكن قراءته في أي مكان.
  • page محلي (Local): يختفي بمجرد انتهاء الدالة.

تخيّل الدالة مثل غرفة مغلقة: ما تضعه داخلها يبقى داخلها. والأفضل دائماً أن تأخذ الدالة ما تحتاجه عبر المعاملات، وتُعيد النتيجة عبر return.

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

اكتب دالة calc_total(price, quantity, delivery=20) تحسب ثمن طلب: السعر × الكمية + التوصيل. ثم اكتب دالة ثانية apply_discount(total, percent) تخصم نسبة مئوية. جرّبهما:

print(calc_total(50, 2))
print(calc_total(30, 3, delivery=0))
الناتج
120
90
  • نسيان القوسين عند الاستدعاء: greet وحدها لا تنفّذ الدالة.
  • استخدام print بدلاً من return: إذا طبعت النتيجة فقط، لن تستطيع استخدامها في حسابات أخرى.
  • تعريف الدالة بعد استدعائها: Python تقرأ من الأعلى للأسفل، فعرّف الدالة قبل أول استدعاء.
  • نسيان النقطتين أو الإزاحة بعد سطر def.

سؤال

ما الكلمة التي نعرّف بها دالة في Python؟

سؤال

ما ناتج power(3) إذا كانت def power(base, exp=2): return base ** exp؟

  • تعرّف الدالة بـ def اسم(معاملات): وتستدعيها بـ اسم().
  • المعاملات تستقبل البيانات، و return تُرجع النتيجة وتُنهي الدالة.
  • الدالة بدون return تُرجع None، ويمكن إرجاع عدة قيم معاً.
  • القيم الافتراضية exp=2 والوسائط المسماة power(exp=3, base=2) تجعل الاستدعاء مرناً.
  • متغيرات الدالة محلية، تعيش داخلها فقط.