الجمعة، 20 ديسمبر 2019

الدوال في بايثون بيثون Python Functions

الدوال في بايثون بيثون

 Python Functions

الدوال في بايثون بيثون Python Functions

الوظيفة عبارة عن كتلة من التعليمات البرمجية المنظمة القابلة لإعادة الاستخدام والتي يتم استخدامها لتنفيذ إجراء واحد متعلق.  توفر وظائف نمطية أفضل للتطبيق الخاص بك ودرجة عالية من إعادة استخدام التعليمات البرمجية.

 كما تعلمون بالفعل ، يوفر لك Python العديد من الوظائف المدمجة مثل print () ، إلخ ، لكن يمكنك أيضًا إنشاء وظائف خاصة بك.  تسمى هذه الوظائف دالات معرفة من قبل المستخدم.

Defining a Function تعريف الدالة او الوظيفة 

يمكنك تحديد وظائف لتوفير الوظيفة المطلوبة.  فيما يلي قواعد بسيطة لتحديد وظيفة في بيثون.

 تبدأ كتل الوظائف بالكلمة الأساسية def متبوعةً باسم الوظيفة والأقواس (()).

 يجب وضع أي معلمات إدخال أو وسيطات ضمن هذه الأقواس.  يمكنك أيضًا تحديد المعلمات ضمن هذه الأقواس.

 يمكن أن تكون العبارة الأولى من دالة عبارة اختيارية - سلسلة وثائق الدالة أو docstring.

 كتلة التعليمات البرمجية داخل كل وظيفة تبدأ بنقطتين (:) ويتم بادئة.

 تُرجع عبارة الإرجاع [تعبير] دالة ، وتمرر تعبيرًا اختياريًا للمتصل.  بيان الإرجاع بدون وسائط هو نفس الإرجاع بلا.

Syntax

def functionname( parameters ):
   "function_docstring"
   function_suite
   return [expression]
بشكل افتراضي ، يكون للمعلمات سلوك موضعي وتحتاج إلى إبلاغهم بنفس الترتيب الذي تم تعريفهم به.

 مثال
 تأخذ الوظيفة التالية سلسلة كمعلمة إدخال وتطبعها على الشاشة القياسية.
def printme( str ):
   "This prints a passed string into this function"
   print str
   return

Calling a Function استدعاء الدالة او الوظيفة

تحديد وظيفة ما يعطيها اسمًا فقط ، ويحدد المعلمات التي سيتم تضمينها في الوظيفة وهيكليات كتل الشفرة.

 بمجرد الانتهاء من البنية الأساسية للوظيفة ، يمكنك تنفيذها عن طريق استدعاءها من وظيفة أخرى أو مباشرة من موجه Python.  فيما يلي مثال لاستدعاء وظيفة printme () -

#!/usr/bin/python

# Function definition is here
def printme( str ):
   "This prints a passed string into this function"
   print str
   return;

# Now you can call printme function
printme("I'm first call to user defined function!")
printme("Again second call to the same function")
عند تنفيذ الرمز أعلاه ، فإنه ينتج النتيجة التالية -
I'm first call to user defined function!
Again second call to the same function

Pass by reference vs value التمرير بواسطة القيمة والمراجع

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

#!/usr/bin/python

# Function definition is here
def changeme( mylist ):
   "This changes a passed list into this function"
   mylist.append([1,2,3,4]);
   print "Values inside the function: ", mylist
   return

# Now you can call changeme function
mylist = [10,20,30];
changeme( mylist );
print "Values outside the function: ", mylist
هنا ، نحافظ على مرجع للكائن الذي تم تمريره والقيم الملحقة في نفس الكائن.  لذلك ، هذا من شأنه أن ينتج النتيجة التالية -
Values inside the function:  [10, 20, 30, [1, 2, 3, 4]]
Values outside the function:  [10, 20, 30, [1, 2, 3, 4]]
يوجد مثال آخر حيث يتم تمرير الوسيطة بالرجوع ويتم استبدال المرجع داخل الوظيفة المطلوبة.

#!/usr/bin/python

# Function definition is here
def changeme( mylist ):
   "This changes a passed list into this function"
   mylist = [1,2,3,4]; # This would assig new reference in mylist
   print "Values inside the function: ", mylist
   return

# Now you can call changeme function
mylist = [10,20,30];
changeme( mylist );
print "Values outside the function: ", mylist
المعلمة mylist هي المحلية إلى changeme الدالة.  لا يؤثر تغيير قائمتي داخل الوظيفة على قائمتي.  لا تحقق الوظيفة شيئًا ، وفي النهاية ينتج عن ذلك النتيجة التالية -
Values inside the function:  [1, 2, 3, 4]
Values outside the function:  [10, 20, 30]

Function Arguments متغيرات الدوال او الوضائف

يمكنك استدعاء دالة باستخدام الأنواع التالية من الوسائط الرسمية -
  • Required arguments المتغيرات الاجبارية
  • Keyword arguments المتغيرات الرئسية 
  • Default arguments المتغيرات الإفتراضية 
  • Variable-length arguments طول المتغيرات

Required arguments المتغيرات المطلوبة

المتغيرات  المطلوبة هي الوسائط التي يتم تمريرها إلى دالة بالترتيب الموضعي الصحيح.  هنا ، يجب أن يتطابق عدد الوسائط في استدعاء الدالة تمامًا مع تعريف الوظيفة.

 للاتصال بـ printme () ، تحتاج بالتأكيد إلى تمرير وسيطة واحدة ، وإلا فإنه يعطي خطأ في بناء الجملة كما يلي -

#!/usr/bin/python

# Function definition is here
def printme( str ):
   "This prints a passed string into this function"
   print str
   return;

# Now you can call printme function
printme()
عند تنفيذ الكود أعلاه ، فإنه ينتج النتيجة التالية -

Traceback (most recent call last):
   File "test.py", line 11, in 
      printme();
TypeError: printme() takes exactly 1 argument (0 given)

Keyword arguments الكلمات الرئسية المتغيرات الوسيطة

ترتبط وسيطات الكلمات الرئيسية باستدعاءات الوظائف.  عند استخدام وسائط الكلمة الأساسية في استدعاء دالة ، يقوم المتصل بتعريف الوسائط حسب اسم المعلمة.

 يتيح لك ذلك تخطي الحجج أو وضعها خارج الترتيب لأن مترجم Python قادر على استخدام الكلمات الأساسية المقدمة لمطابقة القيم مع المعلمات.  يمكنك أيضًا إجراء مكالمات الكلمات الرئيسية إلى وظيفة printme () بالطرق التالية -

#!/usr/bin/python

# Function definition is here
def printme( str ):
   "This prints a passed string into this function"
   print str
   return;

# Now you can call printme function
printme( str = "My string")
عند تنفيذ الرمز أعلاه ، فإنه ينتج النتيجة التالية -

My string
المثال التالي يعطي صورة أكثر وضوحا.  لاحظ أن ترتيب المعلمات لا يهم.

#!/usr/bin/python

# Function definition is here
def printinfo( name, age ):
   "This prints a passed info into this function"
   print "Name: ", name
   print "Age ", age
   return;

# Now you can call printinfo function
printinfo( age=50, name="miki" )

عند تنفيذ الكود أعلاه ، فإنه ينتج النتيجة التالية -
Name:  miki
Age  50

Default arguments المتغيرات الوسيطة الافتراضية

الوسيطة الافتراضية هي وسيطة تفترض قيمة افتراضية إذا لم يتم توفير قيمة في استدعاء دالة لتلك الوسيطة.  يعطي المثال التالي فكرة عن الوسائط الافتراضية ، يقوم بطباعة العمر الافتراضي إذا لم يتم تمريره -
#!/usr/bin/python

# Function definition is here
def printinfo( name, age = 35 ):
   "This prints a passed info into this function"
   print "Name: ", name
   print "Age ", age
   return;

# Now you can call printinfo function
printinfo( age=50, name="miki" )
printinfo( name="miki" )
عند تنفيذ الكود أعلاه ، فإنه ينتج النتيجة التالية -

Name:  miki
Age  50
Name:  miki
Age  35

Variable-length arguments وسيطات متغيرة الطول

قد تحتاج إلى معالجة دالة للوسائط أكثر مما حددته أثناء تحديد الوظيفة.  تسمى هذه الوسائط وسيطات متغيرة الطول ولا تتم تسميتها في تعريف الوظيفة ، بغض النظر عن الوسائط المطلوبة والوسيطة الافتراضية.

 بناء جملة دالة مع وسيطات متغيرات غير الكلمات الرئيسية هو هذا -
def functionname([formal_args,] *var_args_tuple ):
   "function_docstring"
   function_suite
   return [expression]
يتم وضع علامة النجمة (*) قبل اسم المتغير الذي يحتفظ بقيم جميع وسائط المتغيرات غير الأساسية.  تبقى هذه المجموعة فارغة إذا لم يتم تحديد وسيطات إضافية أثناء استدعاء الوظيفة.  فيما يلي مثال بسيط -

#!/usr/bin/python

# Function definition is here
def printinfo( arg1, *vartuple ):
   "This prints a variable passed arguments"
   print "Output is: "
   print arg1
   for var in vartuple:
      print var
   return;

# Now you can call printinfo function
printinfo( 10 )
printinfo( 70, 60, 50 )
عند تنفيذ الكود  أعلاه ، فإنه ينتج النتيجة التالية -
Output is:
10
Output is:
70
60
50

The Anonymous Functions الوظائف او الدوال المجهولة 

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

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

 لا يمكن أن تكون الوظيفة المجهولة دعوة مباشرة للطباعة لأن lambda تتطلب تعبيرًا

 تمتلك وظائف Lambda مساحة الاسم المحلية الخاصة بها ولا يمكنها الوصول إلى المتغيرات بخلاف تلك الموجودة في قائمة المعلمات وتلك الموجودة في مساحة الاسم العالمية.

 على الرغم من أنه يبدو أن lambda هي إصدار من سطر واحد من دالة ، إلا أنها لا تعادل البيانات المضمنة في C أو C ++ ، والغرض منها هو تمرير تخصيص مكدس الوظيفة أثناء الاستدعاء لأسباب تتعلق بالأداء.

الصيغة Syntax

يحتوي بناء جملة وظائف lambda على عبارة واحدة فقط ، وهي كما يلي -

lambda [arg1 [,arg2,.....argn]]:expression

فيما يلي مثال لإظهار كيفية عمل شكل وظيفة lambda -
#!/usr/bin/python

# Function definition is here
sum = lambda arg1, arg2: arg1 + arg2;

# Now you can call sum as a function
print "Value of total : ", sum( 10, 20 )
print "Value of total : ", sum( 20, 20 )

عند تنفيذ الكود أعلاه ، فإنه ينتج النتيجة التالية -
Value of total : 30
Value of total :  40

The return Statement عبارة الإرجاع 

تُرجع عبارة الإرجاع [تعبير] دالة ، وتمرر تعبيرًا اختياريًا للمتصل.  بيان الإرجاع بدون وسائط هو نفس الإرجاع بلا.

 جميع الأمثلة المذكورة أعلاه لا ترجع أي قيمة.  يمكنك إرجاع قيمة من دالة كما يلي -

#!/usr/bin/python

# Function definition is here
def sum( arg1, arg2 ):
   # Add both the parameters and return them."
   total = arg1 + arg2
   print "Inside the function : ", total
   return total;

# Now you can call sum function
total = sum( 10, 20 );
print "Outside the function : ", total 
عند تنفيذ الكود أعلاه ، فإنه ينتج النتيجة التالية -
Inside the function :  30
Outside the function :  30

Scope of Variables نطاق المتغيرات

قد لا يمكن الوصول إلى جميع المتغيرات في البرنامج في جميع المواقع في هذا البرنامج.  هذا يعتمد على المكان الذي أعلنت فيه متغير.

 يحدد نطاق المتغير جزء البرنامج حيث يمكنك الوصول إلى معرف معين.  هناك نوعان من النطاقات الأساسية للمتغيرات في بيثون -
  • Global variables متغيرات عامة 
  • Local variables متغيرات محلية 

المتغيرات المحلية والمتغيرات العامة Global vs. Local variables

المتغيرات التي تم تعريفها داخل جسم دالة لها نطاق محلي ، وتلك التي تم تعريفها في الخارج لها نطاق عالمي.

 هذا يعني أنه لا يمكن الوصول إلى المتغيرات المحلية إلا داخل الوظيفة التي يتم الإعلان عنها فيها ، بينما يمكن الوصول إلى المتغيرات العالمية في جميع أنحاء الجسم من خلال جميع الوظائف.  عند استدعاء دالة ، يتم إدخال المتغيرات التي تم الإعلان عنها بداخلها إلى نطاقها.  فيما يلي مثال بسيط -

#!/usr/bin/python

total = 0; # This is global variable.
# Function definition is here
def sum( arg1, arg2 ):
   # Add both the parameters and return them."
   total = arg1 + arg2; # Here total is local variable.
   print "Inside the function local total : ", total
   return total;

# Now you can call sum function
sum( 10, 20 );
print "Outside the function global total : ", total 
عند تنفيذ الكود أعلاه ، فإنه ينتج النتيجة التالية -
Inside the function local total :  30
Outside the function global total :  0




التسميات: