تخيل أنك تريد طباعة تحية ترحيبية لمستخدمي تطبيقك عشر مرات في أماكن مختلفة من الكود. بدون دوال، ستضطر لكتابة نفس الأسطر العشرين من الكود في كل مرة. هذا ممل، عرضة للأخطاء، ويجعل الكود ضخماً وصعب القراءة. هنا يأتي دور الدوال (Functions).
الدوال هي ببساطة "قطع كود قابلة لإعادة الاستخدام". تأخذ مدخلات (اختيارية)، تقوم بمهمة محددة، وقد ترجع نتيجة (اختيارية). في هذا الدرس، سنتعلم كيف ننظم كودنا باستخدام الدوال لنجعله أكثر وضوحاً وقابلية للصيانة.
في بايثون، نستخدم الكلمة المفتاحية def لتعريف دالة، متبوعة باسم الدالة وأقواس () ونقطتين :. الكود الذي ينتمي للدالة يجب أن يكون مسافة بادئة (indented) تحته.
# تعريف دالة بسيطة لا تأخذ مدخلات ولا ترجع قيمة
def say_hello():
print("مرحباً بك في عالم بايثون!")
print("هذه دالة بسيطة.")
# استدعاء الدالة (تنفيذها)
say_hello()
الشرح:
def say_hello(): : نعرّف دالة اسمها say_hello.say_hello() : هذا هو "الاستدعاء" - هنا فقط يتم تنفيذ الكود داخل الدالة.غالباً ما نريد تمرير معلومات إلى الدالة لتعمل عليها. هذه المعلومات تسمى "وسائط" (Arguments) أو "باراميترات" (Parameters).
# دالة ترحب باسم المستخدم
def greet_user(name):
print(f"أهلاً وسهلاً بك يا {name}!")
print("نتمنى لك تجربة ممتعة.")
# استدعاء الدالة بقيم مختلفة
greet_user("أحمد")
greet_user("سارة")
الشرح:
name هو باراميتر (متغير وهمي) داخل الدالة.greet_user("أحمد")، يتم وضع القيمة "أحمد" في المتغير name داخل الدالة.الدوال لا تطبع فقط، بل يمكنها حساب قيمة وإرجاعها لنا باستخدام الكلمة المفتاحية 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 (لا شيء).بايثون تأتي مع مجموعة غنية من الدوال المدمجة مثل print() و len() و type(). هذه جاهزة للاستخدام فوراً. أما الدوال التي نكتبها نحن، فهي "معرفة من قبل المستخدم" وتسمح لنا بتوسيع قدرات بايثون.
say_hello بدون أقواس لا ينفذ الدالة، بل يشير إلى الكائن نفسه (وهذا خطأ منطقي).print و return: print يعرض النص على الشاشة فقط، بينما return يرسل قيمة لاستخدامها في باقي البرنامج. الدالة التي تستخدم print فقط لا يمكن استخدام نتيجتها في حسابات أخرى.do_stuff() لا يخبرنا بماذا تفعل الدالة. استخدم أسماء واضحة مثل calculate_total_price().الدوال تسمح لنا بتقسيم المشكلة الكبيرة إلى مشاكل صغيرة. هذا المبدأ يسمى "التقسيم والتغلب" (Divide and Conquer). بدلاً من كتابة 100 سطر في برنامج واحد، نكتب 5 دوال كل منها مكونة من 20 سطراً. هذا يجعل:
# برنامج بسيط لإدارة قائمة تسوق
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 وهو شرح للدالة (ممارسة جيدة).اكتب أربع دوال: add(a, b) و subtract(a, b) و multiply(a, b) و divide(a, b). كل دالة تأخذ رقمين وترجع نتيجتهما. ثم اكتب برنامجاً صغيراً يطلب من المستخدم إدخال رقمين وعملية حسابية (+, -, *, /) ويطبع النتيجة باستخدام الدوال المناسبة.
تلميحات:
input() لأخذ المدخلات من المستخدم.float().في الدرس القادم، سنتعلم كيفية التعامل مع القوائم والقواميس، وهي أدوات أساسية لتخزين مجموعات البيانات. استمر في التدرب على الدوال، فهي حجر الزاوية في كتابة كود منظم واحترافي.
جاري تحميل التقييمات...