This post is also available in: English (الإنجليزية) हिन्दी (الهندية)
كمبتدئ ، نكتب برامج صغيرة جدًا. عندما يكون البرنامج صغيرًا بدرجة كافية ، يمكننا الاحتفاظ بجميع تفاصيل البرنامج في رؤوسنا مرة واحدة. برامج التطبيقات الحقيقية أكبر من 100 إلى 10000 مرة من أي برنامج من المحتمل أن تكون قد كتبته (أو ربما عملت عليه) ؛ إنها ببساطة كبيرة جدًا ومعقدة بحيث لا تحمل كل تفاصيلها في رؤوسنا.
أحد الحلول الرئيسية لإدارة تعقيد البرامج الكبيرة هوالبرمجة المعيارية: يتكون الكود من العديد من وحدات التعليمات البرمجية المختلفة المعروفة عمومًا بالوظائف المطورة. يتيح ذلك للمطورين المختلفين أخذ أجزاء منفصلة من النظام وتصميمها وتنفيذها دون الحاجة إلى فهم كل البقية. في هذه المقالة ، سننظر في أنواع مختلفة من الوظائف في بايثون.
ما هي الوظيفة؟
الوظيفة عبارة عن كتلة من التعليمات البرمجية تؤدي بعض المهام المحددة. يمكن استدعائها وإعادة استخدامها عدة مرات. يمكنك تمرير المعلومات وإرسال المعلومات مرة أخرى. العديد من لغات البرمجة لها نوعان من الوظائف:
- وظائف مدمجة: وظيفة مضمنة في تطبيق أو لغة برمجة ويمكن الوصول إليها من قبل المستخدمين النهائيين. على سبيل المثال ، تدعم معظم تطبيقات جداول البيانات وظيفة SUM المضمنة التي تضيف جميع الخلايا في صف أو عمود. وبالمثل ، في C printf () و scanf () هي وظائف مضمنة تُستخدم لطباعة القيم وقراءتها.
- وظائف محددة من قبل المستخدم: يمكن للمستخدم تحديد وظائف للقيام بمهمة ذات صلة ببرامجهم. تسمى هذه الوظائف وظائف محددة من قبل المستخدم. الوظيفة main() التي نكتب فيها جميع برامجنا هي وظيفة محددة من قبل المستخدم.
عند استدعاء وظيفة ، سيقوم البرنامج بإيقاف البرنامج الحالي مؤقتًا وتنفيذ الوظيفة. ستتم قراءة الوظيفة من أعلى إلى أسفل. بمجرد اكتمال الوظيفة ، يستمر البرنامج في العمل حيث توقف مؤقتًا. إذا أعادت الدالة قيمة ، فسيتم استخدام هذه القيمة حيث تم استدعاء الوظيفة.
أنواع الوظائف في بايثون
كما ذكرنا أعلاه ، فإنك تستخدم وظائف في البرمجة لتجميع مجموعة من الإرشادات التي تريد استخدامها بشكل متكرر أو تلك ، نظرًا لتعقيدها ، تكون محتواة ذاتيًا بشكل أفضل في برنامج فرعي ويتم استدعاؤها عند الحاجة. هذا يعني أن الوظيفة هي جزء من التعليمات البرمجية المكتوبة لتنفيذ مهمة محددة. لتنفيذ هذه المهمة المحددة ، قد تحتاج الوظيفة أو لا تحتاج إلى مدخلات متعددة. عند تنفيذ المهمة ، يمكن أو لا يمكن للوظيفة إرجاع قيمة واحدة أو أكثر.
هناك ثلاثة أنواع من الوظائف في بايثون:
- الوظائف المضمنة: هذه هي الوظائف المضمنة في Python مثل help () لطلب المساعدة ، و min () للحصول على الحد الأدنى من القيمة ، وطباعة () print كائن إلى المحطة.
- وظائف محددة من قبل المستخدم (UDFs): هذه هي الوظائف التي أنشأها المستخدم وفقًا لاحتياجاته البرمجية.
- الوظائف المجهولة: تسمى هذه الوظائف أيضًا وظائف lambda لأنه لم يتم الإعلان عنها باستخدام الكلمة الأساسية المعيارية def.
الوظائف مقابل الطرق
دور
الوظيفة عبارة عن كتلة من التعليمات البرمجية لتنفيذ مهمة محددة ، وتحتوي على نطاقها الخاص ، ويُطلق عليها اسمها. قد تحتوي جميع الدوال على صفر (لا) وسيطات أو أكثر من وسيطة واحدة. عند الخروج ، يمكن للدالة أو لا يمكنها إرجاع قيمة واحدة أو أكثر.
بناء جملة الوظيفة الأساسية
def functionName( arg1, arg2,….): ……. # Function_body ……..
فيما يلي مثال على وظيفة الترحيب التي تطبع رسالة ترحيب لاسم تم تمريره في الوظيفة.
def greet(name): “”” This function greets to the person passed in as a parameter “”” print(“Hello, ” + name + “. Good morning!”)>>> greet(‘Paul’)Hello, Paul. Good morning!
طريقة
الطريقة في Python تشبه إلى حد ما الوظيفة ، إلا أنها مرتبطة بالكائنات / الفئات. الطرق في بايثون مشابهة جدًا للوظائف باستثناء اختلافين رئيسيين.
- يتم استخدام الطريقة ضمنيًا لكائن يتم استدعاؤها من أجله.
- هذه الطريقة يمكن الوصول إليها من خلال البيانات الموجودة داخل الفصل الدراسي.
بناء جملة الطريقة الأساسية
class ClassName: def method_name(): ………….. # Method_body ………………
دعنا نفهم الطريقة من خلال الكود البسيط التالي:
class Pet(object): def my_method(self): print(“I am a Cat”)cat = Pet()cat.my_method()
انتاج:
I am a Cat
في الكود أعلاه ، حددنا أولاً فئة الحيوانات Pet، ثم أنشأنا cat كائن من هذا المخطط. بعد ذلك ، نسمي طريقتنا المخصصة التي تسمى my_method بالكائن (أي ، cat).
المعلمات مقابل الحجج
يتم استخدام المصطلحين المعلمة والوسيطة بالتبادل من قبل العديد من المبرمجين ، لكن كلاهما لهما معاني مختلفة.
المعلمة هي نوع خاص من المتغيرات المستخدمة في دالة للإشارة إلى أحد أجزاء البيانات المقدمة كمدخلات للوظيفة. هذه البيانات هي قيم الوسيطات التي من خلالها سيتم استدعاء / استدعاء الوظيفة.
بعبارات أبسط ، فإن الوسيطة هي القيمة الفعلية المقدمة إلى دالة ، بينما المعلمة هي المتغير داخل تعريف الوظيفة. يمكننا القول أن المعلمة هي نوع يظهر في تعريفات الوظائف ، بينما الوسيطة هي مثيل يظهر في استدعاءات الوظيفة. في المثال أعلاه ، يُطلق على الاسم اسم المعلمة ويُطلق على بول اسم وسيطة.
كيفية تحديد وظيفة معرّفة من قبل المستخدم (UDF) في بايثون؟
الخطوات الأربع لتعريف دالة في بايثون هي كالتالي:
- استخدم الكلمة الأساسية def للإعلان عن الوظيفة ومتابعة ذلك باسم الوظيفة.
- أضف معلمات إلى الوظيفة. يجب كتابة هذه بين أقواس الوظيفة. قم بإنهاء خطك بنقطتين.
- أضف العبارات التي يجب أن تنفذها الوظيفة.
- قم بإنهاء وظيفتك بعبارة return إذا كان يجب على الدالة إخراج شيء ما. بدون عبارة الإرجاع ، ستعيد وظيفتك كائنًا بلاكائن.
الحجج الوظيفية في بايثون
أعلاه تعلمت عن الفرق بين المعلمات والحجج. باختصار ، الوسيطات هي الأشياء التي تُعطى لأي دالة جميعًا ، بينما يشير رمز الوظيفة إلى الوسائط بواسطة أسماء المعلمات الخاصة بهم. هناك أربعة أنواع من الحجج التي يمكن أن تتخذها Python UDF:
- الوسائط الافتراضية
- الحجج المطلوبة
- وسيطات الكلمات الرئيسية
- عدد متغير من الحجج
الوسائط الافتراضية
الوسيطات الافتراضية هي تلك التي تأخذ قيمة افتراضية إذا لم يتم تمرير قيمة وسيطة أثناء استدعاء الوظيفة. يمكنك تعيين هذه القيمة الافتراضية باستخدام عامل التعيين = ، تمامًا كما في المثال التالي:
# Define `plus()` functiondef plus(a,b = 2): return a + b# Call `plus()` with only `a` parameterplus(a=1)# Call `plus()` with `a` and `b` parametersplus(a=1, b=3)
الحجج المطلوبة
كما يوحي الاسم ، فإن الحجج المطلوبة لـ UDF هي تلك التي يجب أن تكون موجودة. يجب تمرير هذه الوسائط أثناء استدعاء الوظيفة وبالترتيب الصحيح تمامًا ، فقط في المثال التالي:
# Define `plus()` with required argumentsdef plus(a,b): return a + b
أنت بحاجة إلى وسيطات ترتبط بالمعاملين a بالإضافة إلى المعلمات b لاستدعاء الوظيفة دون الحصول على أي أخطاء. إذا قمت بالتبديل بين a و b ، فلن تكون النتيجة مختلفة ، ولكن قد تكون كذلك إذا قمت بتغيير الوظيفة بالإضافة plus() إلى ما يلي:
# Define `plus()` with required argumentsdef plus(a,b): return a/b
وسيطات الكلمات الرئيسية
إذا كنت تريد التأكد من استدعاء جميع الوسائط بالترتيب الصحيح ، يمكنك اختيار وسيطات الكلمات الأساسية في استدعاء الوظيفة الخاص بك. يمكنك استخدام هذه لتحديد الوسيطات من خلال اسم المعلمة الخاصة بهم. لنأخذ المثال المذكور أعلاه لتوضيح ذلك.
# Define `plus()` functiondef plus(a,b): return a + b# Call `plus()` function with parameters plus(2,3)# Call `plus()` function with keyword argumentsplus(a=1, b=2)
لاحظ أنه باستخدام وسيطات الكلمات الرئيسية ، يمكنك أيضًا التبديل بين ترتيب المعلمات والحصول على نفس النتيجة عند تنفيذ وظيفتك:
# Define `plus()` functiondef plus(a,b): return a + b# Call `plus()` function with keyword argumentsplus(b=2, a=1)
عدد متغير من الحجج
في الحالات التي لا تعرف فيها العدد الدقيق للوسيطات التي تريد تمريرها إلى دالة ، يمكنك استخدام البنية التالية مع * args:
# Define `plus()` function to accept a variable number of argumentsdef plus(*args): return sum(args)# Calculate the sumplus(1,4,5)plus(5,6,7,8,4)
انتاج:
10
30
يتم وضع علامة النجمة (*) قبل اسم المتغير الذي يحتوي على قيم جميع وسيطات المتغيرات غير الكلمات الرئيسية. لاحظ هنا أنك ربما تكون قد مررت أيضًا * varint، * var_int_args ، أو أي اسم آخر لوظيفة plus(). حاول استبدال * args باسم آخر يتضمن علامة النجمة. سترى أن الكود أعلاه يستمر في العمل!
المتغيرات العالمية مقابل المحلية
بشكل عام ، المتغيرات التي تم تحديدها داخل دالة لها نطاق محلي ، والمتغيرات المعرفة بالخارج لها نطاق عام. هذا يعني أن المتغيرات المحلية يتم تعريفها داخل كتلة دالة ولا يمكن الوصول إليها إلا داخل تلك الوظيفة ، بينما يمكن الوصول إلى المتغيرات العامة بواسطة جميع الوظائف التي قد تكون موجودة في البرنامج النصي الخاص بك.
# Global variable `init`init = 1# Define `plus()` function to accept a variable number of argumentsdef plus(*args): # Local variable `sum()` total = 0 for i in args: total += i return total# Access the global variableprint(“this is the initialized value ” + str(init))# (Try to) access the local variableprint(“this is the sum ” + str(total))
سترى أنك ستحصل على NameError يشير إلى أن name “total” is not defined عندما تحاول طباعة total المتغير المحلي الذي تم تحديده داخل جسم الوظيفة. من ناحية أخرى ، يمكن طباعة المتغير init دون أي مشاكل.
وظائف مجهولة في بايثون
تسمى الوظائف المجهولة أيضًا وظائف lambda في Python لأنه بدلاً من الإعلان عنها بكلمة def قياسية ، يمكنك استخدام الكلمة الأساسية lambda.
double = lambda x: x*2double(5)
انتاج:
10
lambda x: x * 2 هي وظيفة مجهول أو دالة lambda. xهي الوسيطة ، و x * 2 هي التعبير أو التعليمات التي يتم تقييمها وإعادتها. ما يميز هذه الوظيفة هو أنها لا تحمل اسمًا ، مثل الأمثلة التي رأيتها في وظائف المثال أعلاه.