الدوال Functions في Python
ما تعريف الدوال Functions في لغة Python..؟! وما أنواع الدوال Functions المتوفرة في بايثون..؟؟ وكيف يتم انشاء دالة Function في بايثون…؟! وما طُرق تمرير القيم إلى الدوال في بايثون...؟! وماهي دوال Lambda في بايثون …؟!
تعد الدوال (Functions) في لغة البرمجة بايثون عنصر أساسي وقوي يساهم في تنظيم وتجزئة الكود وجعله قابلًا لإعادة الاستخدام. حيث تستخدم الدوال لتجميع سلسلة من التعليمات والأوامر لتنفيذ مهمة محددة. في هذا المقال، ستكتشف أهمية الدوال Functions في بايثون وكيفية تعريفها واستخدامها.لنبدأ…
في هذا المقال نتعرف :
- الدوال Functions في Python.
- أنواع الدوال Functions في Python.
- انشاء الدوال Functions في Python.
- تسمية الدوال Functions في Python.
- تمرير القيم الى الدوال Functions في Python.
- الدوال Function والقوائم List في Python.
- دوال lambda واستخدامها في Python.
الدوال Function في Python
الدالة Function في بايثون هي كتلة من التعليمات البرمجية المنظمة والقابلة لإعادة الاستخدام والتي يتم استخدامها لتنفيذ إجراء واحد. بحيث توفر الدوال Functions نمط أفضل للتطبيق من حيث تقسيم المهام في أجزاء الكود القابلة لإعادة الاستخدام.
وتوفر لغة Python أنواع متعددة من الدوال Functions مثل الدوال المضمنة كا الدالة print () ، و يمكننا أيضًا إنشاء دوال خاصة لتنفيذ مهمة محددة وتسمى هذه الدوال (User-defined ) محددة من قبل المستخدم لأنها يتم إنشائها بواسطة المستخدم. وتعد الدوال جزء أساسي ومهم في البرمجة بشكل عام، ويمكن تلخيص أهمية استخدام الدوال Functions في لغة بايثون في :
- إعادة استخدام الكود: باستخدام الدوال في Python، يمكننا بواسطة الدالة كتابة قطعة من الكود لتقوم بمهمة محددة. ثم يمكننا استخدام هذه الدالة عدة مرات في البرنامج دون الحاجة إلى إعادة كتابة نفس الكود مرارًا وتكرارًا. هذا يعزز إعادة استخدام الكود ويجعل البرمجة أكثر كفاءة وسهولة.
- التنظيم والهيكلة: باستخدام الدوال، يمكننا تنظيم الكود الخاص بنا وتجزئته إلى وحدات صغيرة ومنطقية. كما يمكننا تعريف دوال مختلفة لتنفيذ مهام محددة، مما يسهل فهم البرنامج وصيانته فيما بعد. تحسين التنظيم والهيكلة أيضاً يساعد في تطوير برامج قابلة للتوسع والصيانة.
- التجريب والاختبار: باستخدام الدوال، يمكننا اختبار أجزاء محددة من الكود بشكل منفصل. بدلاً من تنفيذ البرنامج بأكمله كل مرة للتحقق من صحة جميع الأجزاء،من خلال اختبار الدوال بشكل مستقل عن بقية البرنامج. وهذا يساعد في تسريع عملية التجريب والتصحيح ويجعل عملية إيجاد الأخطاء أسهل.
- التبسيط والقراءة: باستخدام الدوال، يمكننا تجزئة البرنامج إلى وحدات صغيرة تعبر عن مفهوم واحد. يمكنك تسمية الدوال بأسماء واضحة ووصفية، مما يجعل الكود سهل القراءة والفهم. بالإضافة إلى ذلك، يمكنك توثيق الدوال باستخدام التعليقات لتوضيح وظيفتها.
بشكل عام، استخدام الدوال في Python يساهم في جعل البرمجة أكثر هيكلة وسهولة وإنتاجية. تسهم في تقسيم المشكلة إلى أجزاء صغيرة وقابلة للإدارة، وتعزز إعادة استخدام الكود وتسريع عملية التطوير والاختبار.
أنواع الدوال Functions في Python
يمكن تصنيف الدوال Functions المتوفرة في لغة Python الى أربعة أنواع هي:
- الدوال العامة ( Global Functions) : ونعني بها الدوال التي يمكن الوصول لها من من أي مكون من مكونات البرنامج فهي Global Object بالنسبة لنفس ملف .py الموجودة فيه .
- الدوال المحلية (Local Functions) : الدالة المحلية (تسمى أيضًا الدوال المتداخلة Nested Functions) هي الدوال التي يتم تعريفها داخل دالة أخرى. هذه الدوال مرئية فقط داخل الدالة حيث يتم تعريفها ، وهي مفيدة بشكل خاص لإنشاء دوال مساعدة صغيرة لا فائدة لها في أي مكان آخر.
- الدوال المجهولة lambda : هي تعبيرات ، لذا يمكن إنشاؤها في نقطة استخدامها ؛ ومع ذلك ، فهي محدودة أكثر بكثير من الدوال العادية.
- الـ Methods : هي دوال مرتبطة بنوع بيانات معين ويمكن استخدامها فقط مع نوع البيانات. وتتضح طريقة عملها مع العمل بالبرمجة الموجهة للكائنات OOP في بايثون .
وكما توفر Python العديد من الدوال المضمنة (Built-in Functions )، مثل الدوال input(), print() ، كما وتضيف المكتبة القياسية (Standard Library) ومكتبات الطرف الثالث (Third-party Libraries) مئات الدوال المضمنة الأخرى ، لذلك في كثير من الحالات، وقبل كتابة الدالة التي نريدها بالفعل. يجدر دائمًا التحقق من توفر هذه الدالة في Python عبر الإنترنت لمعرفة هل هي متوفرة بالفعل.
انشاء الدوال Functions في Python.
يمكن للدالة في لغة بايثون أن تستقبل Parameters وترجع قيم حسب مايتطلب عملها، و ويتم إنشاء الدوال بطريقة بسيطة وسهلة، فالصيغة العامة لإعلان دالة عامة Global أو محلية Local تكون كتالي :
def functionName(parameters): function instructions
يمكن إنشاء دالة تنفذ مهمة محددة دون أن ترجع قيمة ويمكن أيضاً انشاء دالة ترجع قيمة ، بشكل عام تتكون الدالة Function في بايثون من:
- يتكون بيان الإعلان عن دالة في بايثون من الكلمة المحجوزة def للإعلان عن دالة في بايثون، ويتبع def اسم الدالة Function Name والأقواس () ثم نقطتين رأسيتين (:).
- في الأقواس يتم وضع مدخلات الدالة ( Parameters).
- ينتهي بيان الإعلان عن الدالة بنقطتين (:) حيث يتم وضع مسافة بادئة للتعليمات بعد بيان الإعلان لتكون هذه التعليمات هي ضمن الـ Scope الخاص بالدالة فأي تعريف للمتغير أو دالة دخل هذا الـ Scope سيكون مرئي فقط لهذه الدالة
- يمكن أن ترجع الدالة بيانات وتكون مخرجات الدالة دائماً بعد الكلمة المحجوزة return .
- لا يمكن الإعلان عن دالة وتركها فارغة، ولكن إذا كان لدينا تعريف دالة بدون محتوى لسبب ما، فيمكن كتابة بيان الإعلان واستخدام عبارة المرور(Pass) لتجنب حدوث خطأ.
وتوضح الأمثلة التالية طريقة انشاء الدوال Functions في بايثون:
في المثال التالي سنقوم بإنشاء دالة مع استخدام عبارة المرور Pass محل تعليمات الدالة:
...........
def printwelcom():
pass
...........
وفي المثال التالي على طريقة إنشاء دالة Function في بايثون لا تستقبل أي قيم ولا ترجع أي قيم:
...........
def printwelcom():
print("Welcom to Python")
...........
ويتم تنفيذ تعليمات الدالة عندما يتم استدعاءها، وطريقة استدعاء الدوال في بايثون تكون بكتابة اسم الدالة في المكان من البرنامج المراد تنفيذها فيه ويتبع اسم الدالة قوسين (). ويكون استدعاء الدالة للمثال السابق كتالي:
...........
def printwelcom():
print("Welcom to Python")
#calling function
printwelcom()
...........
يمكن للدالة ايضاً أن تقوم بإرجاع قيم وهنا نستخدم الكلمة المحجوزة return قبل القيمة المراد إرجاعها و لتحويل الدالة في المثال السابق الة دالة ترجع قيمة نكتب:
...........
def printwelcom():
return print("Welcom to Python")
printwelcom()
...........
تسمية الدوال Functions في Python
في بايثون، هناك بعض القواعد التي يجب اتباعها عند تسمية الدوال، هنا بعض القواعد الأساسية لتسمية الدوال في بايثون:
- يجب أن يبدأ اسم الدالة بحرف صغير.
- يمكن استخدام الحروف الصغيرة والكبيرة والأرقام والشرطة السفلية (_) في اسم الدالة.
- يفضل استخدام الأسماء الوصفية والواضحة للدوال لتوضيح وظيفتها. على سبيل المثال، إذا كنت تريد كتابة دالة لحساب المتوسط، يمكنك تسميتها "calculate_average".
- يجب تجنب استخدام أسماء الدوال المضمنة في لغة بايثون مثل "print" أو "input" كأسماء للدوال الخاصة بك.
- يفضل استخدام التنسيق snake_case في تسمية الدوال، حيث يتم استخدام شرطة السفل (_) لفصل الكلمات في اسم الدالة،على سبيل المثال، "calculate_average_score". (انظر أساليب التسمية في مقال عن المتغير ات في بايثون) .
تذكر أن الالتزام بقواعد تسمية الدوال يساعد على جعل الكود أكثر قراءةً وفهمًا للآخرين، بما في ذلك نفسك في المستقبل، ويسهل عملية المراجعة والتحديث والصيانة في المشروعات البرمجية.
تمرير القيم الى الدوال Functions في Python
كما في لغات البرمجة الأخرى تتيح بايثون تمرير قيم (Arguments ) للدوال و إنشاء دوال تستقبل قيم ( Parameters) ، فيما يلي شرح و امثلة من Python على طريقة تمرير القيم الى الدوال . وفي بداية الحديث عن تمرير القيم نذكر بشرح المصطلحات Arguments و Parameters وهما يستخدمان لوصف نفس الشي وهي المعلومات المعالجة بواسطة الدوال Functions ولكن الفرق:
- Parameters تصف مجموعة المتغيرات المدرجة في بيان إعلان الدالة .
- Arguments تصف مجموعة القيم التي ترسل الى الدالة عند استدعاء الدالة.
في المثال التالي سنقوم بإنشاء دالة في بايثون تستقبل قيم ( Parameters) وطباعتها:
...........
def printwelcom(str):
print(str)
printwelcom("Welcom to Python")
...........
الـ Parameters تكون حسب ماتتطلب وظيفة الدالة وفي حال وجود أكثر من Parameters يتم الفصل بينهما بفاصلة (،) كما يمكن أن نستخدم خاصية القيمة الافتراضية مع الـ Parameters وفي المثال التالي سنقوم بإنشاء دالة Function في بايثون تسطيع إستقبال Parameters وإرجاع نتائج في نفس الوقت .
في المثال التالي سنشيء دالة في بايثون تقوم بحساب القوى (الأس) للأعداد المعطاة لها حيث يمثل المعطى الأول الرقم و الثاني قيمة الأس وارجاع النتيجة لاحظ /ي في هذا المثال استخدام القيمة الافتراضية مع الـ Parameters:
...........
def power(num, x=1):
result = 1
for i in range(x):
result = result * num
return result
#Calling
print(power(2))
print(power(3))
print(power(2, 3))
print(power(3, 2))
...........
الـ Output للمثال:
2 3 8 9
وفي حال لا نستطيع تحديد عدد الـ Arguments التي سيتم تمريرها إلى الدالة سوف توفر بايثون خاصية التجميع (Packing ) حيث تتيح للدالة استقبال عدد من الـ Parameters في تعبير واحد ، ويتم التجميع بإضافة علامة النجمة * قبل اسم الـ Parameter في تعريف الدالة كما يتضح في المثال التالي.
في المثال سنقوم بإنشاء دالة بايثون تستقبل عدد غير محدد من الـ Parameters وتحسب المجوع لها وترجع نتيجة الجمع، لاحظ نتائج الاستدعاءات المختلفة:
...........
def multi_add(*args):
result = 0
for x in args:
result = result + x
return result
#Calling
print(multi_add(1))
print(multi_add(1, 2))
print(multi_add(1, 2, 3))
print(multi_add(1, 2, 3, 4))
...........
الـ Output للمثال:
1 3 6 10
الدوال Function والقوائم List
في بايثون يمكن إرسال أي نوع من أنواع البيانات إلى الدوال (نص string أو رقم number أو قائمة List أو قاموس dir وما إلى ذلك)، وسيتم التعامل معها على أنها نفس نوع البيانات داخل الدالة .في بايثون عند تمرير القائمة List كا Argument يكون نوع التمرير هنا Pass by value ، وهذا يعني ان تأخذ الدالة نسختها من القائمة واي تعديل على القائم سيبقى تأثيره في نطاق الدالة ولا تتأثر به القائمة الأصلية خارج الدالة . ويوضح المثال التالي طريقة تمرير القائمة الى دالة في Python :
...........
def changList( list1 ):
list1 = [10, 20,30, 40]
print ("The list value/'s inside changList function: ", list1)
return
mylist = [1,2,3] #The List outside the function
changList( mylist )
print ("The list value/'s outside changList function: ", mylist)
...........
الـ Output للمثال:
The list value/'s inside changList function: [10, 20, 30, 40] The list value/'s outside changList function: [1, 2, 3]
وفي حال تم تمرير عنصر معين من عناصر القائمة اى الدالة أو تم تمرير القائمة كاملة ومن ثم التعديل على عنصر معين أو المرور على عناصر القائمة كاملة والتعديل عليها عنصر عنصر سيكون التمرير للعناصر من نوع Pass by Reference بحيث يظهر التأثير على عناصر القائمة الأصلية هذا لأن التعديل على بيانات الـ Object و توضح الأمثلة التالية طريقة العمل من خلال تعليمات بايثون :
في المثال التالي سنقوم بإنشاء دالة بايثون تقوم بالتعديل على عنصر من عناصر القائمة ونلاحظ التغير على عناصر القائمة خارج الدالة :
...........
def changElement( List1 ):
print ("The list value/'s inside changElement function before change: ", List1)
List1[2]=0
print ("The list value/'s inside changElement function after change: ", List1)
mylist = [1,2,3] #The List outside the function
changElement( mylist )
print ("The list value/'s outside and after the changElement function: ", mylist)
...........
الـ Output للمثال:
The list value/'s inside changElement function before change: [1, 2, 3] The list value/'s inside changElement function after change: [1, 2, 0] The list value/'s outside and after the changElement function: [1, 2, 0]
في المثال التالي سنقوم بإنشاء دالة بايثون تقوم بتصفير عناصر القائمة ونلاحظ تأثير تغير الدالة على عناصر القائمة خارج الدالة:
...........
def changeList(List2):
print ("The list value/'s inside changeList function before change: ", List2)
for i in range (len(List2)):
List2[i] = 0
print ("The list value/'s inside changeList function after change: ", List2)
mylist = [1,2,3] #The List outside the function
changeList(mylist)
print ("The list value/'s outside and after the changeList function: ", mylist)
...........
الـ Output للمثال:
The list value/'s inside changeList function before change: [1, 2, 0] The list value/'s inside changeList function after change: [0, 0, 0] The list value/'s outside and after the changeList function: [0, 0, 0]
وللمزيد عن طُرق تمرير القيم الر الدوال اطلع على شرح فكرة تمرير المتغيرات الى الدوال في مقال عن التعامل مع الدوال في لغة سي شارب حيث شرح المقال طُرق التمرير Pass By Value و Pass By Reference .
دوال lambda واستخدامها في Python
تسمى هذه الدوال بالدوال المجهولة (lambda ) لأنه لا يتم الإعلان عنها بالطريقة القياسية باستخدام الكلمة المحجوزة def . بل يمكننا استخدام الكلمة المحجوزة lambda لإنشاء هذا النوع من الدوال.
وفي بايثون Lambda وهي دوال صغيرة من سطر واحد ومحدودة التأثير، يمكن أن تأخذ دوال Lambda أي عدد من الـ Arguments ولكنها تُرجع قيمة واحدة فقط في شكل تعبير قصير. ولا يمكن أن تحتوي دوال Lambda على أوامر أو تعبيرات متعددة.
كما لا يمكن لدوال Lambda في بايثون باستدعاء للدوال المضمنة حتى دالة الطباعة print() ، وهذا لأن دوال Lambda تتطلب تعبيرًا فقط دون استدعاءات. وتمتلك دوال Lambda في بايثون نطاق محدود محلي خاص بها ولا يمكنها الوصول إلى متغيرات أخرى غير تلك الموجودة في قائمة Arguments الخاصة بها .
والصيغة العامة لإنشاء دالة Lambda في بايثون تكون:
lambda arguments : expression
وتوضح الأمثلة التالية طريقة إنشاء دوال Lambda.
...........
x = lambda a : a + 5
print(x(10))
x = lambda a , b: a * b
print(x(5, 2))
x = lambda a, b, c : a + b + c
print(x(5, 10 ,15))
...........
الـ Output للمثال:
15 10 30
الى هنا ينتهي هذا المقال الذي تعرفنا فيه على طريقة العمل مع الدوال Functions في بايثون. شرح المقال استخدامات الدوال وانواعها في لغة بايثون، كما شرح طريقة انشاء الدوال في بايثون والطريقة الصحيحة لتسمية الدوال في Python. أيضاً شرح المقال كيفية تمرير القيم إلى الدوال Functions في بايثون، أخيرا تطرق المقال لمفهوم الدوال المجهولة Lambda في بايثون .