إذا كنت قد كتبت أي تعليمات برمجية في بايثون من قبل، فقد استخدمت الدوال بالفعل. Print () وmax () وsum () كلها دوال مدمجة في Python. ومع ذلك، هل تعلم أنه يمكنك أيضًا انشاء دوالك الخاصة؟ دعونا نتعرف على كيفية انشاء واستدعاء دالة في بايثون.
ما هي الدالة في بايثون؟
في البرمجة، الدالة عبارة عن كتلة من التعليمات البرمجية التي تؤدي مهمة معينة أو مجموعة من المهام المرتبطة.
إذا لاحظت أنك غالبًا ما تستخدم نفس مجموعة التعليمات البرمجية مرارًا وتكرارًا، ففكر في كتابة دالة مقابلة. وبعد ذلك، في المرة التالية التي تحتاج فيها إلى هذا الجزء من التعليمات البرمجية، يمكنك ببساطة استدعاء الدالة.
توفر الدوال العديد من الفوائد المهمة:
- تكون الدوال ملائمة عندما تحتاج إلى إنجاز نفس المهمة بانتظام. بعد تحديد دالة، يمكنك ببساطة استدعائها بدلاً من كتابة مقتطف الشفرة نفسه أو نسخه ولصقه مرارًا وتكرارًا. علاوة على ذلك، إذا قررت تغيير مجموعة من التعليمات البرمجية، فأنت تحتاج فقط إلى تغييرها حيث تحدد الدالة. سيتم تطبيق هذا التغيير في أي مكان يتم استدعاء الدالة فيه.
- من خلال تعريف الدوال واستخدامها، يمكنك تقسيم البرامج المعقدة إلى خطوات أصغر. يمكن أن تكون كل خطوة بمثابة دالة منفصلة لحل مهمة محددة.
- أخيرًا، مع الدوال المحددة من قبل المستخدم، عادةً ما يكون من الأسهل متابعة التعليمات البرمجية الخاصة بك. يمكنك أن ترى بوضوح المهمة التي تم إنجازها مع كل كتلة تعليمات برمجية. وينطبق هذا بشكل خاص عندما يتم تعريف الدوال باتباع أفضل الممارسات.
انشاء الدوال في بايثون: بناء الجملة والأمثلة
بناء جملة لتعريف دالة في بايثون هو كما يلي:
def function_name(arguments):
block of code
و هنا شرح لبناء الجملة:
- نبدأ بالكلمة الأساسية
def
لإبلاغ بايثون أنه يتم تعريف دالة جديدة. - ثم نعطي دالتا اسمًا ذا معنى.
- بعد ذلك، نقوم بإدراج الوسيطات أو المعلمات التي تحتاجها الدالة لأداء المهمة بين قوسين. يمكنك تضمين أي عدد تريده من المعلمات. إذا قمت بتعريف دالة بدون معلمات، يمكنك أيضًا ترك الأقواس فارغة.
- يشير رمز النقطتين “:” إلى نهاية رأس الدالة والانتقال إلى نص الدالة.
- بعد المسافة البادئة، نكتب كتلة التعليمات البرمجية اللازمة لأداء المهمة التي بين أيدينا.
- عند الانتهاء من كتلة التعليمات البرمجية، نترك سطرًا فارغًا لتحديد نهاية تعريف الدالة.
دوال مع معلمة واحدة
لنبدأ بدالة بسيطة تأخذ الاسم كمدخل وتطبع سطر المقدمة. إليك كيفية تحديد هذه الدالة:
def introduction(name):
"""Introduces a person given their name"""
print('Hello! My name is', name)
هذه الدالة، التي تسمى introduction، لها وسيطة واحدة، name يتضمن نص هذه الدالة سطرًا واحدًا فقط، يطبع الرسالة، بما في ذلك name. لقد أضفنا أيضًا تعليقًا يشرح الغرض من الدالة.
الآن، دعونا نقوم باستدعاءها ونتحقق من النتيجة:
introduction(‘pyarabic’)
النتيجة
Hello! My name is pyarabic
نقوم ببساطة بتمرير الاسم إلى دالتنا (لاحظ علامتي الاقتباس نظرًا لأن الاسم عبارة عن سلسلة) ونحصل على الرسالة التمهيدية كنتيجة.
حتى الدالة الصغيرة التي تحتوي على سطر واحد فقط من التعليمات البرمجية توفر لنا الوقت إذا تم استخدامها بانتظام. لذا، تخيل فوائد كتل التعليمات البرمجية الأطول!
دوال بدون معلمات
في بعض الحالات، قد ترغب في تعريف الدوال دون أية وسائط. على سبيل المثال، لنكتب دالة تطبع رسالة خطأ حول كلمة مرور غير صحيحة:
def error_message_password():
"""Prints out an error message about the incorrect password"""
print('Sorry. We couldn’t log you in. The password you entered didn’t match our records.')
هذه الدالة لا تحتاج إلى أي معلمات. لذلك، قمنا بتعريفها مع ترك الأقواس فارغة. عند استدعاء هذه الدالة، ما عليك سوى كتابة اسمها متبوعً بقوسين فارغين:
error_message_password()
النتيجة
Sorry. We couldn’t log you in. The password you entered didn’t match our records.
دوال مع معلمات متعددة
الآن دعونا نحدد دالة أكثر تعقيدًا بمعلمات متعددة. هذه المرة، نريد إنشاء دالة تحسب عمر الشخص بالسنوات بناءً على تاريخ ميلاده (السنة، الشهر، اليوم ). الدالة هي كما يلي:
from datetime import date
def get_age(birth_year, birth_month, birth_day):
"""Calculates age (in years) based on birth year, birth month, and birth day."""
birth_date = date(birth_year, birth_month, birth_day)
age = date.today() - birth_date
age_years = age.days / 365.2425
return age_years
نبدأ باستيراد فئة التاريخ من وحدة datetime
للعمل بسهولة مع التواريخ.
الآن، نحن جاهزون لتحديد دالة get_age
الخاصة بنا. لاحظ أن هذه الدالة تتطلب ثلاث وسائط: Birth_year
، Birth_month
، Birth_day
. في نص الدالة get_age
، نقوم أولاً بتحديد birth_date
بناءً على المعلومات المقدمة.
ثم نحسب العمر بالأيام عن طريق طرح تاريخ الميلاد من تاريخ اليوم. وأخيرًا، نحسب العمر بالسنوات عن طريق قسمة العمر بالأيام على 365.2425
، وهو متوسط عدد الأيام في السنة الواحدة.
لاحظ عبارة return في نهاية تعريف الدالة. في الأمثلة السابقة، كنا نستخدم دالة print()
التي أتاحت لنا رؤية مخرجات كل دالة. لكن في معظم الحالات، تحتاج فقط إلى الدالة لإرجاع قيمة معينة، وليس بالضرورة طباعتها.
استخدم الكلمة الأساسية return لتحديد القيمة المرجعة، والتي يمكن أن تكون تقريبًا أي كائن Python (على سبيل المثال، عدد صحيح، سلسلة، قائمة، صف، قاموس، مجموعة، وما إلى ذلك).
الآن، لنستدعي الدالة get_age()
باستخدام وسائط متعددة. لدينا خياران فيما يتعلق بتمرير الوسائط:
- الوسائط الموضعية. يتضمن ذلك تمرير الوسائط بالترتيب الذي يتوافق مع المعلمات الموجودة في تعريف الدالة:
get_age(1987, 9, 2)
# النتيجة
33.57221571969308
- وسيطات الكلمات الرئيسية. يتضمن ذلك تمرير الوسائط بترتيب عشوائي وتحديد كل معلمة بالاسم:
get_age(birth_day=2, birth_month=9, birth_year=1987)
# النتيجة
33.57221571969308
باستخدام وسيطات الكلمات الرئيسية، لا يتعين عليك الانتباه إلى ترتيب الوسيطات، ولكن يتعين عليك كتابة الأسماء الدقيقة لجميع المعلمات.
لاحظ أيضًا أنه بغض النظر عن الخيار الذي تختاره، يجب أن يتطابق عدد الوسائط مع عدد المعلمات في تعريف الدالة.
في النتيجة السابقة، يمكنك أن ترى أن الدالة get_age()
ترجع العمر بالسنوات كما هو مطلوب مع عبارة return. ومع ذلك، بدلاً من مجرد إخراج هذه القيمة، قد نرغب في تخصيصها لمتغير:
kate_age = get_age(1987, 9, 2)
print(kate_age)
# النتيجة
33.57221571969308
الآن، المتغير kate_age
يحمل القيمة التي تم إرجاعها بواسطة الدالة get_age()
.
أفضل الممارسات لكتابة الدوال في بايثون
أود أن أختم هذا الدليل بإدراج بعض الممارسات المفيدة لتعريف الدوال في بايثون:
- استخدم أسماء دالة ذات معنى. يجب أن تحتوي دوالك على أسماء ذات معنى تعكس المهام التي تم تعيينها لإنجازها. يعمل هذا على تحسين إمكانية قراءة التعليمات البرمجية ليس فقط للمبرمجين الآخرين الذين يعملون مع التعليمات البرمجية الخاصة بك ولكن أيضًا لنفسك عندما تعود إلى التعليمات البرمجية بعد مرور بعض الوقت. تأكد أيضًا من اتباع اصطلاحات Python لأسماء الدوال: استخدم الأحرف الصغيرة فقط، وافصل الكلمات بشرطة سفلية.
- تعيين مهمة واحدة لدالة واحدة. ومن الناحية المثالية، يجب أن تكون دالة واحدة مسؤولة عن مهمة واحدة. وهذا يدعم بنية التعليمات البرمجية الواضحة ويحسن إمكانية القراءة.
- تقديم تعليقات على مهمة الدالة. تأكد من تضمين ملخص مختصر لما تفعله الدالة أسفل الرأس مباشرةً. يُسمى هذا التعليق بسلسلة مستندية ويجب أن يكون محاطًا بعلامات اقتباس ثلاثية (“””).
اتبع هذه الممارسات حتى تبدو التعليمات البرمجية الخاصة بك نظيفة واحترافية.
اكتشاف المزيد من بايثون العربي
اشترك للحصول على أحدث التدوينات المرسلة إلى بريدك الإلكتروني.