الفصل : 8
الجزء : 3
العنوان : ال FUNCTIONS
تخزين الدوال في الوحدات (Modules)
إحدى مميزات الدوال هي الطريقة التي تفصل بها كتل الكود عن البرنامج الرئيسي. عندما تستخدم أسماء وصفية لدوالك، تصبح برامجك أسهل بكثير في المتابعة. يمكنك أن تأخذ خطوة إضافية عن طريق تخزين دوالك في ملف منفصل يسمى وحدة (Module) ثم استيراد تلك الوحدة إلى برنامجك الرئيسي. تعني عبارة الاستيراد (import statement) أن تطلب من Python جعل الكود في الوحدة متاحًا في ملف البرنامج الجاري تشغيله حاليًا.
يتيح لك تخزين دوالك في ملف منفصل إخفاء تفاصيل كود برنامجك والتركيز على منطقه الأعلى. كما يتيح لك إعادة استخدام الدوال في العديد من البرامج المختلفة. عندما تخزن دوالك في ملفات منفصلة، يمكنك مشاركة تلك الملفات مع مبرمجين آخرين دون الحاجة لمشاركة برنامجك بالكامل. معرفة كيفية استيراد الدوال تتيح لك أيضًا استخدام مكتبات الدوال التي كتبها مبرمجون آخرون.
هناك عدة طرق لاستيراد وحدة، وسأعرض لك كل واحدة منها بإيجاز.
استيراد وحدة كاملة
لبدء استيراد الدوال، نحتاج أولاً إلى إنشاء وحدة. الوحدة هي ملف ينتهي
ب .py يحتوي على الكود الذي تريد استيراده إلى برنامجك. لنقم بإنشاء وحدة تحتوي على الدالة make_pizza(). لإنشاء هذه الوحدة، سنزيل كل شيء من الملف pizza.py باستثناء الدالة make_pizza():
الآن سننشئ ملفًا منفصلًا يسمى making_pizzas.py في نفس الدليل الذي يحتوي على pizza.py. هذا الملف يستورد الوحدة التي أنشأناها للتو ثم ينادي دالة make_pizza() مرتين:
عندما يقرأ Python هذا الملف، تخبره عبارة `import pizza` بفتح ملف pizza.py ونسخ كل الدوال منه إلى هذا البرنامج. لن ترى الكود يُنسخ بين الملفات لأن Python ينسخ الكود وراء الكواليس، قبل تشغيل البرنامج مباشرة. كل ما تحتاج معرفته هو أن أي دالة معرّفة في pizza.py ستكون متاحة الآن في making_pizzas.py.
لنداء دالة من وحدة مستوردة، أدخل اسم الوحدة التي استوردتها، `pizza`، متبوعًا باسم الدالة، `make_pizza()`، مفصولين بنقطة. هذا الكود ينتج نفس النتيجة كالبرنامج الأصلي الذي لم يستورد وحدة:
`
هذا النهج الأول للاستيراد، حيث تكتب ببساطة `import` متبوعًا باسم الوحدة، يجعل كل دالة من الوحدة متاحة في برنامجك. إذا استخدمت هذا النوع من عبارة الاستيراد لاستيراد وحدة كاملة باسم `module_name.py`، ستكون كل دالة في الوحدة متاحة من خلال الصيغة التالية:
استيراد دوال محددة
يمكنك أيضًا استيراد دالة محددة من وحدة. إليك الصيغة العامة لهذا النهج:
يمكنك استيراد عدد من الدوال من وحدة بفصل أسماء كل دالة بفاصلة:
سيبدو مثال making_pizzas.py هكذا إذا أردنا استيراد الدالة التي سنستخدمها فقط:
مع هذه الصيغة، لا تحتاج لاستخدام الترقيم النقطي عند نداء الدالة. لأننا استوردنا صراحة الدالة make_pizza() في عبارة الاستيراد، يمكننا نداؤها بالاسم عند استخدامها.
استخدام `as` لإعطاء دالة اسمًا مستعارًا
إذا كان اسم الدالة التي تستوردها قد يتعارض مع اسم موجود بالفعل في برنامجك، أو إذا كان اسم الدالة طويلًا، يمكنك استخدام اسم مستعار قصير وفريد - اسم بديل مشابه للكنية للدالة. ستعطي الدالة هذه الكنية الخاصة عند استيرادها.
هنا نمنح الدالة make_pizza() الاسم المستعار mp()، عن طريق استيراد make_pizza كـ mp. الكلمة الأساسية `as` تعيد تسمية الدالة باستخدام الاسم المستعار الذي توفره:
عبارة الاستيراد الموضحة هنا تعيد تسمية الدالة make_pizza() إلى mp() في هذا البرنامج. في أي وقت نريد نداء make_pizza() يمكننا ببساطة كتابة mp() بدلاً من ذلك، وPython ستشغل الكود في make_pizza() مع تجنب أي لبس مع دالة make_pizza() أخرى قد تكون كتبتها في ملف هذا البرنامج.
الصيغة العامة لتوفير اسم مستعار هي:
استخدام `as` لإعطاء وحدة اسمًا مستعارًا
يمكنك أيضًا توفير اسم مستعار لاسم الوحدة. إعطاء الوحدة اسمًا مستعارًا قصيرًا، مثل p لـ pizza، يتيح لك نداء دوال الوحدة بسرعة أكبر. نداء p.make_pizza() أكثر اختصارًا من نداء pizza.make_pizza():
تم منح وحدة pizza الاسم المستعار p في عبارة الاستيراد، ولكن جميع دوال الوحدة تحتفظ بأسمائها الأصلية. نداء الدوال بكتابة p.make_pizza() ليس فقط أكثر اختصارًا من pizza.make_pizza()، ولكنه أيضًا يعيد توجيه انتباهك بعيدًا عن اسم الوحدة ويسمح لك بالتركيز على الأسماء الوصفية لدوالها. هذه الأسماء الدوال، التي تخبرك بوضوح ما تفعله كل دالة، أكثر أهمية لقراءة الكود من استخدام اسم الوحدة الكامل.
الصيغة العامة لهذا النهج هي:
استيراد جميع الدوال في وحدة
يمكنك أن تطلب من Python استيراد كل دالة في وحدة باستخدام عامل النجمة (*):
النجمة في عبارة الاستيراد تخبر Python بنسخ كل دالة من وحدة pizza إلى ملف هذا البرنامج. لأن كل دالة مستوردة، يمكنك نداء كل دالة بالاسم دون استخدام الترقيم النقطي. ومع ذلك، من الأفضل عدم استخدام هذا النهج عندما تعمل مع وحدات أكبر لم تكتبها: إذا كانت الوحدة تحتوي على اسم دالة يطابق اسم موجود بالفعل في مشروعك، يمكنك الحصول على نتائج غير متوقعة. قد يرى Python عدة دوال أو متغيرات بنفس الاسم، وبدلاً من استيراد كل الدوال بشكل منفصل، سيقوم بالكتابة فوق الدوال.
أفضل نهج هو استيراد الدالة أو الدوال التي تريدها، أو استيراد الوحدة بأكملها واستخدام الترقيم النقطي. هذا يؤدي إلى كود واضح يسهل قراءته وفهمه. أدرجت هذا القسم لتتعرف على عبارات الاستيراد مثل ما يلي عندما تراها في كود الآخرين:
تنسيق الدوال
تحتاج إلى مراعاة بعض التفاصيل عند تنسيق الدوال. يجب أن تكون للدوال أسماء وصفية، ويجب أن تستخدم هذه الأسماء الحروف الصغيرة والشرطات السفلية. تساعد الأسماء الوصفية في فهمك وفهم الآخرين لما يحاول الكود القيام به. يجب أن تستخدم أسماء الوحدات هذه الاصطلاحات أيضًا.
يجب أن تحتوي كل دالة على تعليق يشرح باختصار ما تقوم به الدالة. يجب أن يظهر هذا التعليق مباشرة بعد تعريف الدالة ويستخدم صيغة docstring. في دالة موثقة جيدًا، يمكن للمبرمجين الآخرين استخدام الدالة بقراءة الوصف فقط في docstring. يجب أن يكونوا قادرين على الثقة بأن الكود يعمل كما هو موصوف، وطالما أنهم يعرفون اسم الدالة، والمعلمات التي تحتاجها، ونوع القيمة التي ترجعها، يجب أن يكونوا قادرين على استخدامها في برامجهم.
إذا حددت قيمة افتراضية لمعلمة، فلا يجب استخدام مسافات على جانبي علامة التساوي:
يجب استخدام نفس الاصطلاح للمعلمات بالكلمات المفتاحية في نداء الدوال:
يوصي PEP 8 (https://www.python.org/dev/peps/pep-0008) بأن تحدد خطوط الكود إلى 79 حرفًا حتى يكون كل سطر مرئيًا في نافذة محرر بحجم معقول. إذا تسببت مجموعة من المعلمات في أن يكون تعريف الدالة أطول من 79 حرفًا، اضغط ENTER بعد القوس الافتتاحي في خط التعريف. في السطر التالي، اضغط مفتاح TAB مرتين لفصل قائمة المعلمات عن جسم الدالة، الذي سيتم ترميزه بمستوى واحد فقط.
تقوم معظم المحررات تلقائيًا بمحاذاة أي سطور إضافية من المعلمات لتتطابق مع التنسيق الذي أنشأته على السطر الأول:
إذا كان برنامجك أو وحدتك يحتوي على أكثر من دالة واحدة، يمكنك فصل كل منها بسطرين فارغين لجعل من السهل رؤية أين تنتهي دالة وتبدأ الأخرى.
يجب كتابة جميع عبارات الاستيراد في بداية الملف. الاستثناء الوحيد هو إذا استخدمت تعليقات في بداية ملفك لوصف البرنامج ككل.
جرب بنفسك
تمرين 8-15. طباعة النماذج: ضع الدوال لمثال printing_models.py في ملف منفصل يسمى printing_functions.py. اكتب عبارة الاستيراد في بداية printing_models.py، وعدل الملف لاستخدام الدوال المستوردة.
تمرين 8-16. الاستيرادات: باستخدام برنامج كتبته يحتوي على دالة واحدة فيه، احفظ تلك الدالة في ملف منفصل. استورد الدالة في ملف برنامجك الرئيسي، واستدعي الدالة باستخدام كل من هذه النهج:
- import module_name
- from module_name import function_name
- from module_name import function_name as fn
- import module_name as mn
- from module_name import *
تمرين 8-17. تنسيق الدوال: اختر أي ثلاثة برامج كتبتها لهذا الفصل، وتأكد من أنها تتبع إرشادات التنسيق الموضحة في هذا القسم.
ملخص
في هذا الفصل، تعلمت كيفية كتابة الدوال وتمرير المعلمات بحيث تكون للدوال إمكانية الوصول إلى المعلومات التي تحتاجها لأداء عملها. تعلمت كيفية استخدام المعلمات الموضعية والكلمات المفتاحية، وكذلك كيفية قبول عدد عشوائي من المعلمات. رأيت دوال تعرض نتائج ودوال ترجع قيمًا. تعلمت كيفية استخدام الدوال مع القوائم، القواميس، عبارات if، وloops while. رأيت أيضًا كيفية تخزين دوالك في ملفات منفصلة تسمى وحدات، مما يجعل ملفات برامجك أبسط وأسهل في الفهم. أخيرًا، تعلمت تنسيق دوالك بحيث تستمر برامجك في أن تكون منظمة بشكل جيد وسهلة القراءة قدر الإمكان لك وللآخرين.
يجب أن يكون أحد أهدافك كمبرمج هو كتابة كود بسيط يقوم بما تريده، والدوال تساعدك على فعل ذلك. إنها تتيح لك كتابة كتل من الكود وتركها وشأنها بمجرد أن تعرف أنها تعمل. عندما تعرف أن الدالة تقوم بعملها بشكل صحيح، يمكنك الوثوق بأنها ستستمر في العمل والمضي قدمًا إلى مهمة البرمجة التالية.
تتيح لك الدوال كتابة الكود مرة واحدة ثم إعادة استخدام هذا الكود بقدر ما تريد. عندما تحتاج إلى تشغيل الكود في دالة، كل ما تحتاج إلى كتابته هو سطر واحد والدالة تقوم بعملها. عندما تحتاج إلى تعديل سلوك الدالة، لا يلزمك سوى تعديل كتلة كود واحدة، وستؤثر تغييراتك في كل مكان قمت باستدعاء الدالة فيه.
استخدام الدوال يجعل برامجك أسهل في القراءة، والأسماء الجيدة للدوال تلخص ما تفعله كل جزء من البرنامج. قراءة سلسلة من استدعاءات الدوال تعطيك فهمًا أسرع لما يقوم به البرنامج مقارنة بقراءة سلسلة طويلة من كتل الكود.
تجعل الدوال أيضًا كودك أسهل في الاختبار وتصحيح الأخطاء. عندما يتم تنفيذ معظم عمل برنامجك بواسطة مجموعة من الدوال، كل منها يقوم بمهمة محددة، يكون من الأسهل بكثير اختبار وصيانة الكود الذي كتبته. يمكنك كتابة برنامج منفصل يستدعي كل دالة ويختبر ما إذا كانت كل دالة تعمل في جميع المواقف التي قد تواجهها. عندما تقوم بذلك، يمكنك أن تكون واثقًا بأن دوالك ستعمل بشكل صحيح في كل مرة تستدعيها.
في الفصل التاسع، ستتعلم كيفية كتابة الفئات (Classes). الفئات تجمع بين الدوال والبيانات في حزمة واحدة أنيقة يمكن استخدامها بطرق مرنة وفعالة.
النهاية
نكون هنا انتهينا من الفصل 8 من منهج تعلم Python من كتاب python crash course بالعربية
واذا واجهتك اي مشكلة في الفهم او ما شابه , يمكنك على الفور الذهاب الى المجتمع الخاص بنا في Telegram للمناقشة والتواصل معنا من هنا
او اذا واجهتك مشكلة في الموقع او تريد اجابة سريعة يمكنك الذهاب الى اخر صفحة في الموقع ستجد صفحة اتصل بنا موجودة يمكنك ارسالة لنا مشكلتك , وسيتم الرد عليها بسرعة جدا ان شاء الله
ويمكنك الأنضمام الى المجتمع Hidden Lock بالكامل مع جميع قنواته للأستفادة في اخر الأخبار في عالم التقنية وايضا الكتب بالمجان والكورسات والمقالات من خلال الرابط التالي لمجموعة القنوات من هنا
يمكنك ايضا متابعتنا في منصات X او Twitter سابقا , لمشاهدة الاخبار والمقالات السريعة والمهمة من
وفقط كان معكم sparrow مقدم هذه الشهادة من فريق Hidden Lock