الدوال في Python (Functions)
كلما كبر برنامجك، ستجد أنك تكرر نفس الأسطر في أماكن مختلفة. الدوال (Functions) تحل هذه المشكلة: تكتب الكود مرة واحدة، وتعطيه اسماً، وتستخدمه متى شئت. في هذا الدرس ستتعلم كيف تنشئ دوالك الخاصة، وتمرر لها البيانات، وتأخذ منها النتائج.
إنشاء دالة
Section titled “إنشاء دالة”الدالة تُنشأ بالكلمة def (اختصار define أي «عرِّف»)، ثم اسمها، ثم قوسان ونقطتان، ثم الكود المُزاح:
def greet(): print("أهلاً بك في مدرسة البرمجة!")
greet()greet()أهلاً بك في مدرسة البرمجة!أهلاً بك في مدرسة البرمجة!هنا خطوتان:
- التعريف بـ
def: يكتب «الوصفة» فقط، ولا يُنفّذ شيئاً. - الاستدعاء بكتابة الاسم والقوسين
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'return: أرجع نتيجة
Section titled “return: أرجع نتيجة”الدالة تستطيع أن تحسب شيئاً وتعطيك النتيجة لتستخدمها:
def add(a, b): return a + b
result = add(4, 6)print(result)print(add(10, 20) * 2)1060تخيّلها مثل آلة العصير: تضع فيها الفاكهة (المعاملات)، فتخرج لك كوب العصير (القيمة المرجعة). وعندما تصل Python إلى return تخرج من الدالة فوراً:
def check_age(age): if age < 13: return "عذراً، الموقع لمن هم 13 سنة فأكبر" return "مرحباً بك!"
print(check_age(10))print(check_age(16))عذراً، الموقع لمن هم 13 سنة فأكبرمرحباً بك!الدالة بدون return
Section titled “الدالة بدون return”إذا لم تكتب return، تُرجع الدالة None:
def double(n): n * 2
print(double(4))Noneإرجاع أكثر من قيمة
Section titled “إرجاع أكثر من قيمة”ميزة جميلة في 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))2588في السطر الأخير استخدمنا الوسائط المسماة: كتبنا اسم المعامل مع قيمته، فلم يعد الترتيب مهماً. هذا يجعل الاستدعاء أوضح عندما تكون المعاملات كثيرة.
المتغيرات المحلية والعامة
Section titled “المتغيرات المحلية والعامة”المتغير الذي تنشئه داخل الدالة يعيش داخلها فقط:
site = "مدرسة البرمجة"
def show(): page = "الرئيسية" print(site, "-", page)
show()print(page)مدرسة البرمجة - الرئيسيةNameError: name 'page' is not definedsiteعام (Global): معرّف خارج أي دالة، ويمكن قراءته في أي مكان.pageمحلي (Local): يختفي بمجرد انتهاء الدالة.
تخيّل الدالة مثل غرفة مغلقة: ما تضعه داخلها يبقى داخلها. والأفضل دائماً أن تأخذ الدالة ما تحتاجه عبر المعاملات، وتُعيد النتيجة عبر return.
لماذا الدوال مهمة؟
Section titled “لماذا الدوال مهمة؟”- عدم التكرار: تكتب الكود مرة واحدة وتستخدمه مئة مرة. وإذا وجدت خطأ، تصلحه في مكان واحد فقط.
- تقسيم المشكلة: البرنامج الكبير يصبح مجموعة من الدوال الصغيرة، لكل منها مهمة واضحة واسم يشرحها.
- سهولة الاختبار: تستطيع أن تجرّب كل دالة وحدها، وتتأكد أنها تعمل قبل أن تجمعها مع غيرها.
- إعادة الاستخدام: الدوال الجيدة تنقلها من مشروع إلى آخر. والمكتبات الجاهزة مثل
randomما هي إلا مجموعات من الدوال كتبها مبرمجون آخرون.
جرّب بنفسك
Section titled “جرّب بنفسك”اكتب دالة calc_total(price, quantity, delivery=20) تحسب ثمن طلب: السعر × الكمية + التوصيل. ثم اكتب دالة ثانية apply_discount(total, percent) تخصم نسبة مئوية. جرّبهما:
print(calc_total(50, 2))print(calc_total(30, 3, delivery=0))12090أخطاء شائعة
Section titled “أخطاء شائعة”- نسيان القوسين عند الاستدعاء:
greetوحدها لا تنفّذ الدالة. - استخدام print بدلاً من return: إذا طبعت النتيجة فقط، لن تستطيع استخدامها في حسابات أخرى.
- تعريف الدالة بعد استدعائها: Python تقرأ من الأعلى للأسفل، فعرّف الدالة قبل أول استدعاء.
- نسيان النقطتين أو الإزاحة بعد سطر
def.
اختبر نفسك
Section titled “اختبر نفسك”سؤال
ما الكلمة التي نعرّف بها دالة في Python؟
الدوال في Python تُعرَّف بالكلمة def.
سؤال
ما ناتج power(3) إذا كانت def power(base, exp=2): return base ** exp؟
exp لها قيمة افتراضية 2، فالنتيجة 3 ** 2 = 9.
الخلاصة
Section titled “الخلاصة”- تعرّف الدالة بـ
def اسم(معاملات):وتستدعيها بـاسم(). - المعاملات تستقبل البيانات، و
returnتُرجع النتيجة وتُنهي الدالة. - الدالة بدون
returnتُرجعNone، ويمكن إرجاع عدة قيم معاً. - القيم الافتراضية
exp=2والوسائط المسماةpower(exp=3, base=2)تجعل الاستدعاء مرناً. - متغيرات الدالة محلية، تعيش داخلها فقط.