الدوال وتنظيم الكود

الدوال وتنظيم الكود

45 دقيقة
٨ يونيو ٢٠٢٦
المرحلة 1 من 6

مقدمة: لماذا نحتاج الدوال؟

الدرس الخامس: الدوال وتنظيم الكود (Functions and Code Organization)

لماذا نحتاج إلى الدوال؟

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

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

الفكرة الأساسية: تعريف دالة واستدعاؤها

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

مثال عملي 1: أول دالة لك

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

# استدعاء الدالة (تنفيذها)
say_hello()

الشرح:

  • def say_hello(): : نعرّف دالة اسمها say_hello.
  • السطران التاليان (بمسافة بادئة) هما جسم الدالة.
  • say_hello() : هذا هو "الاستدعاء" - هنا فقط يتم تنفيذ الكود داخل الدالة.

الدوال التي تأخذ مدخلات (Parameters)

غالباً ما نريد تمرير معلومات إلى الدالة لتعمل عليها. هذه المعلومات تسمى "وسائط" (Arguments) أو "باراميترات" (Parameters).

مثال عملي 2: دالة بمدخل واحد

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

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

الشرح:

  • name هو باراميتر (متغير وهمي) داخل الدالة.
  • عند الاستدعاء greet_user("أحمد")، يتم وضع القيمة "أحمد" في المتغير name داخل الدالة.
  • يمكننا استدعاء الدالة عدة مرات بقيم مختلفة.

الدوال التي ترجع قيمة (Return Values)

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

مثال عملي 3: دالة حسابية مع return

# دالة تحسب مساحة مستطيل
def calculate_area(length, width):
    area = length * width
    return area  # إرجاع النتيجة

# استخدام الدالة
result = calculate_area(5, 3)
print(f"مساحة المستطيل هي: {result}")

# يمكننا استخدام الدالة مباشرة في تعبير آخر
double_area = calculate_area(5, 3) * 2
print(f"ضعف المساحة هو: {double_area}")

الشرح:

  • return area : يوقف تنفيذ الدالة ويرجع القيمة المحفوظة في المتغير area.
  • نحن "نلتقط" القيمة المرجعة ونخزنها في متغير (result) أو نستخدمها مباشرة.
  • بدون return، الدالة ترجع None (لا شيء).

أنواع الدوال: مدمجة (Built-in) مقابل معرفة من قبل المستخدم (User-defined)

بايثون تأتي مع مجموعة غنية من الدوال المدمجة مثل print() و len() و type(). هذه جاهزة للاستخدام فوراً. أما الدوال التي نكتبها نحن، فهي "معرفة من قبل المستخدم" وتسمح لنا بتوسيع قدرات بايثون.

أخطاء شائعة للمبتدئين

  • نسيان الأقواس عند الاستدعاء: كتابة say_hello بدون أقواس لا ينفذ الدالة، بل يشير إلى الكائن نفسه (وهذا خطأ منطقي).
  • نسيان المسافة البادئة: كل كود داخل الدالة يجب أن يكون بمسافة بادئة ثابتة (عادة 4 مسافات).
  • الخلط بين print و return: print يعرض النص على الشاشة فقط، بينما return يرسل قيمة لاستخدامها في باقي البرنامج. الدالة التي تستخدم print فقط لا يمكن استخدام نتيجتها في حسابات أخرى.
  • تسمية الدوال بأسماء غير معبرة: اسم مثل do_stuff() لا يخبرنا بماذا تفعل الدالة. استخدم أسماء واضحة مثل calculate_total_price().

تنظيم الكود باستخدام الدوال

الدوال تسمح لنا بتقسيم المشكلة الكبيرة إلى مشاكل صغيرة. هذا المبدأ يسمى "التقسيم والتغلب" (Divide and Conquer). بدلاً من كتابة 100 سطر في برنامج واحد، نكتب 5 دوال كل منها مكونة من 20 سطراً. هذا يجعل:

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

مثال عملي 4: برنامج منظم باستخدام دوال

# برنامج بسيط لإدارة قائمة تسوق

def add_item(shopping_list, item):
    """إضافة عنصر إلى القائمة"""
    shopping_list.append(item)
    print(f"تم إضافة {item} إلى القائمة.")

def remove_item(shopping_list, item):
    """إزالة عنصر من القائمة"""
    if item in shopping_list:
        shopping_list.remove(item)
        print(f"تم إزالة {item} من القائمة.")
    else:
        print(f"العنصر {item} غير موجود في القائمة.")

def show_list(shopping_list):
    """عرض جميع العناصر في القائمة"""
    if not shopping_list:
        print("القائمة فارغة.")
    else:
        print("قائمة التسوق:")
        for i, item in enumerate(shopping_list, 1):
            print(f"{i}. {item}")

# --- البرنامج الرئيسي ---
my_list = []
add_item(my_list, "حليب")
add_item(my_list, "خبز")
add_item(my_list, "بيض")
show_list(my_list)
remove_item(my_list, "خبز")
show_list(my_list)

الشرح:

  • لاحظ كيف أن كل دالة تقوم بمهمة واحدة محددة.
  • النص بين """ """ يسمى Docstring وهو شرح للدالة (ممارسة جيدة).
  • البرنامج الرئيسي أصبح بسيطاً جداً: مجرد استدعاءات لدوال.

تمرين صغير (Practice Task)

التمرين: حاسبة بسيطة

اكتب أربع دوال: add(a, b) و subtract(a, b) و multiply(a, b) و divide(a, b). كل دالة تأخذ رقمين وترجع نتيجتهما. ثم اكتب برنامجاً صغيراً يطلب من المستخدم إدخال رقمين وعملية حسابية (+, -, *, /) ويطبع النتيجة باستخدام الدوال المناسبة.

تلميحات:

  • استخدم input() لأخذ المدخلات من المستخدم.
  • تذكر تحويل المدخلات النصية إلى أرقام باستخدام float().
  • في دالة القسمة، تأكد من أن المقسوم عليه ليس صفراً.

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

جاري تحميل التقييمات...