الدوال (Functions): كيف تكتب كوداً نظيفاً قابلاً لإعادة الاستخدام؟


الدوال (Functions): كيف تكتب كوداً نظيفاً قابلاً لإعادة الاستخدام؟

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

الخطوة 1: تعريف دالة بسيطة واستدعاؤها

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

ملاحظة تقنية: تُعرف الدالة باستخدام الكلمة المفتاحية def، يليها اسم الدالة، ثم قوسين ()، ونقطتين :. يجب أن يكون الكود داخل الدالة مزاحًا (indented).

لنقم بتعريف دالة بسيطة تقوم فقط بطباعة رسالة ترحيب:

# تعريف دالة بسيطة لا تأخذ أي معاملات ولا تُرجع قيمة
def greet():
    print("مرحباً بك في عالم الدوال!") # طباعة رسالة ترحيب
    print("هذه دالة لا تحتاج إلى معلومات خارجية.")

# استدعاء الدالة لتنفيذ الكود بداخلها
greet()

الخطوة 2: الدوال ذات المعاملات (Parameters)

لجعل الدوال أكثر مرونة، يمكننا تمرير معلومات إليها عبر "المعاملات" (Parameters). المعاملات هي متغيرات يتم تعريفها داخل أقواس الدالة وتسمح للدالة بالعمل على بيانات مختلفة في كل مرة يتم استدعاؤها.

ملاحظة تقنية: تُضاف المعاملات بين القوسين () عند تعريف الدالة. عند استدعاء الدالة، يتم تمرير "الوسيطات" (Arguments) المقابلة لهذه المعاملات.

سنقوم بتعديل دالة الترحيب لتأخذ اسم المستخدم كمعامل:

# تعريف دالة تأخذ معامل واحد (name)
def greet_user(name):
    print(f"أهلاً وسهلاً يا {name}!") # استخدام المعامل في رسالة الترحيب
    print("سعيدون بتواجدك هنا.")

# استدعاء الدالة مع تمرير قيم مختلفة للمُعامل
greet_user("أحمد")
greet_user("فاطمة")

الخطوة 3: الدوال التي تُرجع قيماً (Return Values)

غالبًا ما نحتاج أن تقوم الدالة بحساب شيء ما ثم تُعيد النتيجة لكي نستخدمها في جزء آخر من الكود. يتم ذلك باستخدام الكلمة المفتاحية return.

ملاحظة تقنية: عند استخدام return، تتوقف الدالة عن التنفيذ وتُعيد القيمة المحددة. يمكن تخزين هذه القيمة في متغير أو استخدامها مباشرة.

لنقم بإنشاء دالة لجمع رقمين وإرجاع الناتج:

# تعريف دالة تأخذ مُعاملين وتُرجع ناتج جمعهما
def add_numbers(num1, num2):
    sum_result = num1 + num2 # حساب المجموع
    return sum_result # إرجاع القيمة المحسوبة

# استدعاء الدالة وتخزين القيمة المرجعة في متغير
result1 = add_numbers(10, 5)
print(f"ناتج جمع 10 و 5 هو: {result1}")

result2 = add_numbers(100, 200)
print(f"ناتج جمع 100 و 200 هو: {result2}")

الخطوة 4: بناء دالة عملية وقابلة لإعادة الاستخدام (حساب المتوسط)

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

# تعريف دالة لحساب متوسط قائمة من الأرقام
def calculate_average(numbers):
    if not numbers: # التحقق مما إذا كانت القائمة فارغة لتجنب القسمة على صفر
        return 0.0 # إرجاع 0.0 إذا كانت القائمة فارغة (أو يمكن إثارة خطأ)
    total = sum(numbers) # حساب مجموع الأرقام في القائمة
    count = len(numbers) # حساب عدد الأرقام
    average = total / count # حساب المتوسط
    return average # إرجاع قيمة المتوسط

# استخدام الدالة مع قوائم مختلفة
grades1 = [85, 90, 78, 92, 88]
avg1 = calculate_average(grades1)
print(f"متوسط الدرجات [85, 90, 78, 92, 88] هو: {avg1:.2f}")

grades2 = [60, 70, 80]
avg2 = calculate_average(grades2)
print(f"متوسط الدرجات [60, 70, 80] هو: {avg2:.2f}")

empty_list = []
avg_empty = calculate_average(empty_list)
print(f"متوسط قائمة فارغة هو: {avg_empty}")

الكود النهائي الكامل

إليك الكود المجمع لجميع الدوال التي كتبناها في هذا الدرس:

# الخطوة 1: تعريف دالة بسيطة لا تأخذ أي معاملات ولا تُرجع قيمة
def greet():
    print("مرحباً بك في عالم الدوال!")
    print("هذه دالة لا تحتاج إلى معلومات خارجية.")

# الخطوة 2: تعريف دالة تأخذ معامل واحد (name)
def greet_user(name):
    print(f"أهلاً وسهلاً يا {name}!")
    print("سعيدون بتواجدك هنا.")

# الخطوة 3: تعريف دالة تأخذ مُعاملين وتُرجع ناتج جمعهما
def add_numbers(num1, num2):
    sum_result = num1 + num2
    return sum_result

# الخطوة 4: تعريف دالة لحساب متوسط قائمة من الأرقام
def calculate_average(numbers):
    if not numbers:
        return 0.0
    total = sum(numbers)
    count = len(numbers)
    average = total / count
    return average

# --- استدعاء الدوال لاختبارها ---

# استدعاء الدالة greet
print("\n--- اختبار دالة greet ---")
greet()

# استدعاء الدالة greet_user
print("\n--- اختبار دالة greet_user ---")
greet_user("محمد")
greet_user("سارة")

# استدعاء الدالة add_numbers
print("\n--- اختبار دالة add_numbers ---")
sum_result_test = add_numbers(25, 15)
print(f"ناتج جمع 25 و 15 هو: {sum_result_test}")

# استدعاء الدالة calculate_average
print("\n--- اختبار دالة calculate_average ---")
data_points = [10, 20, 30, 40, 50]
avg_data = calculate_average(data_points)
print(f"متوسط [10, 20, 30, 40, 50] هو: {avg_data:.2f}")

empty_data = []
avg_empty_data = calculate_average(empty_data)
print(f"متوسط قائمة فارغة هو: {avg_empty_data}")

النتيجة المتوقعة

عند تشغيل الكود النهائي الكامل، ستحصل على المخرجات التالية في الطرفية (Console):

--- اختبار دالة greet ---
مرحباً بك في عالم الدوال!
هذه دالة لا تحتاج إلى معلومات خارجية.

--- اختبار دالة greet_user ---
أهلاً وسهلاً يا محمد!
سعيدون بتواجدك هنا.
أهلاً وسهلاً يا سارة!
سعيدون بتواجدك هنا.

--- اختبار دالة add_numbers ---
ناتج جمع 25 و 15 هو: 40

--- اختبار دالة calculate_average ---
متوسط [10, 20, 30, 40, 50] هو: 30.00
متوسط قائمة فارغة هو: 0.0