؛

التنقل في المنتدى
تحتاج لتسجيل الدخول لإنشاء مشاركات أو مواضيع.

بايثون3 مِن مدارس w3-22Python Functions

تنويه:
لِأن التاب لا تظهر على الصفحة, و هي شيء مهم جدا في الإزاحة في كود بايثون
لذلك فإننا سنستبدل التاب بالكلمة 'tab' على هذه الصفحة
و مِن الأفضل إذا شئت أن تنسخ أي كود, أن تأخذه مِن الملف النصي, أو الملفات المُرفقة.

الدوال أو الوظائف في بايثون

الدالة عبارة عن كتلة من التعليمات البرمجية يتم تشغيلها فقط عند استدعائها.
يمكنك تمرير البيانات ، المعروفة باسم المعاملات أو الوسائط، إلى الدالة.
يمكن للدالة إرجاع البيانات كنتيجة.

إنشاء دالة
في Python يتم إنشاء الدالة باستخدام الكلمة الرئيسية def :
مثال
def my_function():
tab print("Hello from a function")

استدعاء الدالة أو الوظيفة
لاستدعاء دالة ، استخدم اسم الدالة متبوعًا بأقواس(parenthesis):
مثال
def my_function():
tab print("Hello from a function")

my_function()

ستكون النتيجة:
Hello from a function
جربها بنفسك مِن ملف function.py

المعامِلات أو الوسائط(Arguments)
يمكن تمرير المعلومات إلى الدالة كَوسائط.
يتم تحديد الوسيطات بعد اسم الوظيفة ، داخل الأقواس(parenthesis).
يمكنك إضافة العديد من الوسائط كما تريد ، فقط افصل بينها بفاصلة.
المثال التالي له دالة ذات وسيطة واحدة (fname).
عندما يتم استدعاء الدالة ، نقوم بتمرير الاسم الأول (first name)، والذي يتم استخدامه داخل الدالة لطباعة الاسم الكامل:
مثال
def my_function(fname):
tab print(fname + " Refsnes")

my_function("Emil")
my_function("Tobias")
my_function("Linus")

ستكون النتيجة:
Emil Refsnes
Tobias Refsnes
Linus Refsnes
جربها بنفسك مِن ملف function_param.py
غالبًا ما يتم اختصار arguments إلى args في وثائق Python.

معامِلات أَم وسائط؟
يمكن استخدام المصطلحان المعامِل والوسيطة لنفس الشيء: المعلومات التي يتم تمريرها إلى دالة.
من منظور الدالة:
المعامِل هو المتغير المُدْرج داخل الأقواس في تعريف الدالة.
الوسيطة هي القيمة التي يتم تمريرها إلى الدالة عند استدعائها.

عدد الوسائط(Arguments)
بشكل افتراضي ، يجب استدعاء الدالة بالعدد الصحيح من الوسائط.
بمعنى أنه إذا كانت وظيفتك تتوقع وسيطتين ، فعليك استدعاء الدالة باستخدام وسيطتين ، وليس أكثر وليس أقل.
مثال
تتوقع هذه الوظيفة وسيطين ، وتحصل على وسيطين:
def my_function(fname, lname):
tab print(fname + " " + lname)

my_function("Emil", "Refsnes")

ستكون النتيجة:
Emil Refsnes
جربها بنفسك مِن ملف function_args_n.py
إذا حاولت استدعاء الدالة باستخدام وسيط واحد أو ثلاثة وسائط ، فستحصل على خطأ:
مثال
تتوقع هذه الوظيفة وسيطتين ، ولكنها تحصل على وسيط واحد فقط:
def my_function(fname, lname):
tab print(fname + " " + lname)

my_function("Emil")

ستكون النتيجة:
Traceback (most recent call last):
File "function_args_error.py", line 4, in <module>
my_function("Emil")
TypeError: my_function() missing 1 required positional argument: 'lname'
جربها بنفسك مِن ملف function_args_error.py

Arbitrary Arguments, *args
الوسائط العشوائية, *args
إذا كنت لا تعرف عدد الوسائط التي سيتم تمريرها إلى الدالة الخاصة بك، أضف * قبل اسم المعامِل في تعريف الدالة.
بهاذه الطريقة ، ستتلقى الدالة مجموعة من الوسائط (tuple of arguments)، ويمكنها الوصول إلى العناصر وفقًا لذلك:
مثال
إذا كان عدد الوسائط غير معروف ، أضف *قبل اسم المعامِل:
def my_function(*kids):
tab print("The youngest child is " + kids[2])

my_function("Emil", "Tobias", "Linus")

ستكون النتيجة:
The youngest child is Linus
جربها بنفسك مِن ملف function_args.py
غالبًا ما يتم اختصار الوسائط العشوائية إلى * args في وثائق Python.

الوسائط الرئيسية أو المُعَرَّفة(Keyword Arguments)
يمكنك أيضًا تمرير وسيطات باستخدام طريقة key = value .
و بهاذه الطريقة لا يهم ترتيب الوسائط.
مثال
def my_function(child3, child2, child1):
tab print("The youngest child is " + child3)

my_function(child1 = "Emil", child2 = "Tobias", child3 = "Linus")

ستكون النتيجة:
The youngest child is Linus
جربها بنفسك مِن ملف function_kwargs.py
غالبًا ما يتم اختصار عبارة Keyword Arguments إلى kwargs في وثائق Python.

Arbitrary Keyword Arguments, **kwargs
وسائط الكلمات الرئيسية العشوائية ، ** kwargs
إذا كنت لا تعرف عدد وسيطات الكلمات الأساسية(keyword arguments) التي سيتم تمريرها إلى وظيفتك ، فقم بإضافة نجمتين: **قبل اسم المعامِل في تعريف الوظيفة.
بهاذه الطريقة ستتلقى الوظيفة قاموسًا من الوسائط ، ويمكنها الوصول إلى العناصر وفقًا لذلك:
مثال
إذا كان عدد وسيطات الكلمات الرئيسية (keyword arguments)غير معروف ، فقم بإضافة **قبل اسم المعامِل:
def my_function(**kid):
tab print("His last name is " + kid["lname"])

my_function(fname = "Tobias", lname = "Refsnes")

ستكون النتيجة:
His last name is Refsnes
جربها بنفسك مِن ملف function_kwargs_n.py
غالبًا ما يتم اختصار وسيطات الكلمات الرئيسية العشوائية إلى ** kwargs في وثائق Python.

القيمة الافتراضية للمعامِل
يوضح المثال التالي كيفية استخدام قيمة معامِل افتراضي.
إذا استدعينا الدالة بدون وسيط ، فإنها تستخدم القيمة الافتراضية:
مثال
def my_function(country = "Norway"):
tab print("I am from " + country)

my_function("Sweden")
my_function("India")
my_function()
my_function("Brazil")

ستكون النتيجة:
I am from Sweden
I am from India
I am from Norway
I am from Brazil
جربها بنفسك مِن ملف function_param2.py

تمرير القائمة في الدالة كوسيطة(Argument)
يمكنك تمرير أي نوع مِن أنواع البيانات كوسيطة إلى وظيفة (سلسلة نصِّيَّة، رقم ، قائمة ، قاموس إلخ.) ، وسيتم التعامل معها على أنها نفس نوع البيانات داخل الوظيفة.
على سبيل المثال ، إذا قمت بجعل قائمة كوسيطة، فستظل قائمة عندما تصل إلى استدعاء الوظيفة:
مثال
def my_function(food):
tab for x in food:
tab tab print(x)

fruits = ["apple", "banana", "cherry"]

my_function(fruits)

ستكون النتيجة:
apple
banana
cherry
جربها بنفسك مِن ملف function_param3.py

إرجاع القيم في الدالة
للسماح للدالة بإرجاع قيمة ، استخدم العبارة return :
مثال
def my_function(x):
tab return 5 * x

print(my_function(3))
print(my_function(5))
print(my_function(9))

ستكون النتيجة:
15
25
45
جربها بنفسك مِن ملف function_return.py

عبارة التمرير(pass Statement)
لا يمكن أن يكون محتوى الوظائف فارغا ، ولكن إذا كان لديك لسبب ما تعريف وظيفة بدون محتوى ، فضع فيها عبارة pass لتجنب حدوث خطأ.
مثال
def myfunction():
tab pass

# إنشاء دالة فارغة مثل هذه, كان سيؤدي إلى حدوث خطأ مِن دون عبارة التمرير.

ستكون النتيجة:

جربها بنفسك مِن ملف function_pass.py

التكرار أو العودية للدالة(Recursion)
يقبل Python أيضًا تكرار الوظيفة ، مما يعني أن الوظيفة المحددة يمكنها استدعاء نفسها.
التكرار(Recursion) هو مفهوم رياضي وبرمجي شائع.
هذا يعني أن الوظيفة تستدعي نفسها. هذا له فائدة بمعنى أنه يمكنك تكرار البيانات للوصول إلى نتيجة.
يجب أن يكون المطور حريصًا جدًا في التعامل مع العودية(Recursion )
حيث قد يكون من السهل جدًا الانزلاق إلى كتابة وظيفة لا تنتهي أبدًا ، أو وظيفة تستخدم كميات زائدة من الذاكرة أو طاقة المعالِج.
ومع ذلك ، عند كتابة العودية بشكل صحيح ، يمكن أن تكون طريقة فعالة للغاية وأنيقة من الناحية الحسابية للبرمجة.
في هذا المثال ، tri_recursion () هي دالة قمنا بإنشائها لتستدعي نفسها ("recurse").
نستخدم المتغير k كوسيط للدالة ، والتي تنخفض قيمته ( -1 ) في كل مرة تُستدعى الدالة فيها.
تنتهي العودية(Recursion) عندما لا تكون قيمةْ k أكبر من 0 (أي عندما تكون 0).
بالنسبة للمطور الجديد ، قد يستغرق الأمر بعض الوقت لمعرفة كيفية عمل ذلك بالضبط ، وأفضل طريقة لمعرفة ذلك هي اختباره وتعديله.
مثال
مثال على العودية(Recursion)
def tri_recursion(k):
tab if(k > 0):
tab tab result = k + tri_recursion(k - 1)
tab tab print(result)
tab else:
tab tab result = 0
tab return result

print("\n\nRecursion Example Results")
tri_recursion(6)

ستكون النتيجة:

Recursion Example Results
1
3
6
10
15
21
جربها بنفسك مِن ملف recursion.py

اختبر نفسك مع التمارين
التمرين:
قم بإنشاء دالة باسم my_function.
... ...:
tab print("Hello from a function")

الإجابة:
def my_function():
tab print("Hello from a function")

الدرس مع الملفات المُرفقة:
https://www.dropbox.com/s/7dsiw2klzo6c5z9/22Python%20Functions.zip?dl=1

Skip to content