الدوال والوحدات في بايثون – سلسلة بايثونات لتعلم لغة البايثون

شرح درس الدوال والوحدات - بايثونات

أهلًا بكم في المقال الخامس من سلسلة بايثونات لتعلم البايثون. نتكلم في هذا المقال حول موضوع الدوال والوحدات في بايثون ومن خلاله سنعرف كيف نُعرف دالة function في بايثون وكيف نتعامل مع الوحدات والمكتبات المُضمنة في بيئة بايثون.

يأتي هذا المقال استكمالًا لسلسلة مقالات مُيسرة هدفها تبسيط المعلومة للمبتدئين الراغبين في تعلم البايثون. ستسطيع عزيزي القارئ ممارسة وتطبيق مفاهيم هذا المقال بشكل مباشر داخله وذلك لمزيد من التعلم ولمحاولة تثبيت المعلومات، ولكن في البداية ننصحك بأخذ جولة في مقالات السلسلة:

  1. لغة بايثون للمبتدئين – سلسلة بايثونات لتعلم البايثون والانطلاق في عالم البرمجة.
  2. النصوص في بايثون.
  3. المتغيرات والتراكيب في بايثون.
  4. جُمل التحكم في بايثون.
  5. الدوال والوحدات بايثون.
  6. مُعالجة الأخطاء في بايثون.
  7. البرمجة الكائنية في بايثون.
الدوال والوحدات في بايثون
الدوال والوحدات في بايثون

تعريف الدوال في بايثون

الدالة عبارة عن كتلة من شيفرة برمجية لها إسم أو عنوان نضعه لهذه الكتلة (اسم الدالة) ويتم استدعاء هذه الكتلة عند الحاجة إليها لتنفيذ الشيفرة البرمجية التي بداخلها. يُمكن تعريف الدالة بحيث تستقبل معاملات parameters وتكون هذه المعاملات عبارة عن مُدخلات يتم استخدامها داخل الشيفرة البرمجية الخاصة بالدالة.

لتعريف دالة في البايثون نستخدم الكلمة المحجوزة def والتي تُحدد بدء تعريف الدالة:

[pastacode lang=”python” manual=”def%20function_name(parameter_1%2C%20paramter_2)%3A%0A%09print(parameter_1%2C%20parameter_2)” message=”” highlight=”” provider=”manual”/]

لاستدعاء الدالة، نكتب الإسم الخاص بها ثم نكتب قوس ونُغلقه اذا لم يكن هناك مُعطيات arguments سنمررها لها، وإلا نكتب المعطيات ثم نُغلق القوس.

في المثال التالي نُعرف متغير باسم x ونُعطيه قيمة 10 ونُعرف مُتغير آخر باسم y ونُعطيه قيمة 5، ثُم نُعرف دالة باسم multiply تقوم بطباعة نتيجة ضرب قيمة المتغيرين بعد تمريرهما لها. لتشغيل الشيفرة البرمجية اضغط على زر run:

[pastacode lang=”python” manual=”x%20%3D%2010%20%0Ay%20%3D%205%20%0A%0Adef%20multiply(a%2Cb)%3A%20%0A%09result%20%3D%20a%20*%20y%20%0A%09print(%22Result%20is%3A%20%22%20%2C%20result)%20%0A%09%0Amultiply(x%2Cy)” message=”” highlight=”” provider=”manual”/]

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

إذا أردنا أن نُرجع قيمة من الدالة عند استدعاءها، نستخدم الكلمة المحجوزة في البايثون return ثم القيمة المُرجعة. المثال التالي يُوضح نفس المثال السابق ولكن باستخدام return:

[pastacode lang=”python” manual=”x%20%3D%2010%20%0Ay%20%3D%205%20%0A%0Adef%20multiply(a%2Cb)%3A%20%0A%09result%20%3D%20a%20*%20y%20%0A%09return%20result%0A%09%0Aprint(multiply(x%2Cy))” message=”” highlight=”” provider=”manual”/]

طُرق استدعاء الدوال في البايثون

نُلاحظ في المثال السابق أننا استدعينا الدالة من خلال تمرير نفس العدد من المعاملات التي عرفنا فيها الدالة. لو مررنا معاملين بدل ثلاثة للدالة sum_triple سيظهر لنا خطأ TypeError: missing 1 required positional argument وسُيسمي لك اسم المعامل الذي لم يأخذ قيمة.

السبب هنا هو أن استدعاء الدالة يتم بشكل تلقائي وفق طريقة “أماكن المعاملات” والتي فيها يجب تمرير كافة المعاملات وبنفس الترتيب.

يُمكننا تمرير معامل بقيمة مُسبقة عن طريق إعطاء المعامل القيمة التي نريدها عند تعريف الدالة. المثال التالي يُوضح ذلك:

[pastacode lang=”python” manual=”x%20%3D%2010%20%0Ay%20%3D%2050%20%0Az%20%3D%2030%20%0A%0Adef%20sum_triple(a%2Cb%2Cc%3D50)%3A%20%0A%09result%20%3D%20a%20%2B%20b%20%2B%20c%20%0A%09return%20result%0A%0Asum_triple(x%2Cy)” message=”” highlight=”” provider=”manual”/]

لاحظ أننا أعطينا المعامل c قيمة تلقائية 50، وبذلك عند استدعاء الدالة نستطيع تجاهل هذا المعامل وعدم اعطاءه قيمة.

يُمكن تغيير أماكن المعاملات عند استدعاء الدالة وذلك عن طريق تحديد أسماء المعاملات واعطاءها القيم بطريقة صحيحة. انظر المثال التالي:

[pastacode lang=”python” manual=”def%20sum_triple(a%2Cb%2Cc)%3A%20%0A%09result%20%3D%20a%20%2B%20b%20%2B%20c%20%0A%09return%20result%0A%0Asum_triple(c%3D10%2Ca%3D5%2Cb%3D2)” message=”” highlight=”” provider=”manual”/]

لو أردنا أن نُغير الدالة sum_triple لتُصبح تستقبل 4 قيم لجمعها، عندها سنضيف معامل آخر. ولكن هذه الطريقة غير مناسبة في حالة كان عدد المتغيرات غير معلوم لدينا.

تعريف الدوال بعدد غير محدد من المعاملات

نستطيع تعريف دالة تستقبل عدد غير محدد من المعاملات عن طريق *args و **kwargs كما في المثال التالي:

[pastacode lang=”python” manual=”def%20sum(*args%2C%20**kwargs)%3A%20%0A%09print(args)%0A%09print(kwargs)%0A” message=”” highlight=”” provider=”manual”/]

*args تعني عدد غير مُحدد من العوامل، و **kwargs تعني عدد غير محدد من العوامل المُسماة key word arguments.

ملاحظة هامة: عند تعريف دالة ما، يجب أن نبدأ بكتابة *args قبل كتابة **kwargs وإلا سيظهر لنا خطأ SyntaxError، وكذلك عند الاستدعاء، يجب أن نُمرر المعاملات غير المُسماة قبل المعاملات المُسماة.

يُوجد طريقة اخرى لاستدعاء الوظائف باستخدام args/kwargs وذلك عندما تكون المعطيات على شكل tuple أو قاموس كما يلي:

[pastacode lang=”python” manual=”args%20%3D%20(1%2C%202%2C%203%2C%204)%0A%0Akwargs%20%3D%20%7B%22a%22%3A%203%2C%20%22b%22%3A%204%7D%0A%0Aall_the_args(*args)%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%20%23%20equivalent%20to%20foo(1%2C%202%2C%203%2C%204)%0A%0Aall_the_args(**kwargs)%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%20%23%20equivalent%20to%20foo(a%3D3%2C%20b%3D4)%0A%0Aall_the_args(*args%2C%20**kwargs)%C2%A0%20%23%20equivalent%20to%20foo(1%2C%202%2C%203%2C%204%2C%20a%3D3%2C%20b%3D4)” message=”” highlight=”” provider=”manual”/]

يُمكننا إرجاع نتيجة من قيم متعددة على شكل tuple عند تعريف الدالة كما يلي:

[pastacode lang=”python” manual=”def%20swap(x%2C%20y)%3A%0A%20%20%20%20return%20y%2C%20x%0A%0Ax%20%3D%201%0Ay%20%3D%202%0A%0Ax%2C%20y%20%3D%20swap(x%2C%20y)%C2%A0%C2%A0%C2%A0″ message=”” highlight=”” provider=”manual”/]

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

كما في لغات البرمجة المختلفة، مفهوم نطاق scope المتغيرات هو موضوع مهم في أي لغة برمجة. نعني بالنطاق هنا هو المكان/المجال الذي يكون فيه متغير ما مُتاحًا للوصول إليه. إذا عرَّفنا مجموعة متغيرات داخل دالة، فإن هذه المتغيرات يكون نطاقها داخل الدالة، ولا يُمكن الوصول لها من خارج الدالة إلا بطريقة معينة.

[pastacode lang=”python” manual=”x%20%3D%205%0A%0Adef%20set_x(num)%3A%0A%C2%A0%C2%A0%C2%A0%20%23%20%D8%A7%D9%84%D9%85%D8%AA%D8%BA%D9%8A%D8%B1%20%D8%A7%D9%84%D9%85%D8%AD%D9%84%D9%8A%20%D9%8A%D8%AE%D8%AA%D9%84%D9%81%20%D8%B9%D9%86%20%D8%A7%D9%84%D9%85%D8%AA%D8%BA%D9%8A%D8%B1%20%D9%81%D9%8A%20%D8%A7%D9%84%D9%86%D8%B7%D8%A7%D9%82%20%D8%A7%D9%84%D9%88%D8%A7%D8%B3%D8%B9%0A%C2%A0%C2%A0%C2%A0%20x%20%3D%20num%C2%A0%C2%A0%C2%A0%20%23%20%3D%3E%2043%0A%C2%A0%C2%A0%C2%A0%20print(x)%C2%A0%C2%A0%20%23%20%3D%3E%2043%0A%09%0Aset_x(43)” message=”” highlight=”” provider=”manual”/]

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

[pastacode lang=”python” manual=”def%20set_global_x(num)%3A%0A%C2%A0%C2%A0%C2%A0%20global%20x%0A%C2%A0%C2%A0%C2%A0%20print(x)%C2%A0%C2%A0%20%23%20%3D%3E%205%0A%C2%A0%C2%A0%C2%A0%20x%20%3D%20num%C2%A0%C2%A0%C2%A0%20%23%20%D9%87%D8%B0%D8%A7%20%D8%A7%D9%84%D9%85%D8%AA%D8%BA%D9%8A%D8%B1%20%D9%8A%D9%85%D8%AB%D9%84%20%D8%A7%D9%84%D9%85%D8%AA%D8%BA%D9%8A%D8%B1%20%D8%B9%D9%84%D9%89%20%D8%A7%D9%84%D9%86%D8%B7%D8%A7%D9%82%20%D8%A7%D9%84%D8%B9%D8%A7%D9%85%20%D9%88%D9%82%D9%8A%D9%85%D8%AA%D9%87%20%D8%A7%D9%84%D8%A7%D9%86%206%0A%C2%A0%C2%A0%C2%A0%20print(x)%C2%A0%C2%A0%20%23%20%3D%3E%206%0A%0Aset_x(43)%0Aset_global_x(6)” message=”” highlight=”” provider=”manual”/]

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

مكتبات بايثون
مكتبات بايثون

تتضمن لغة البرمجة بايثون العديد من المكتبات المعيارية Packages/Libraries التي تحتوي الكثير من الوحدات Modules. عند بناء برنامج أو نظام، يتم تجزئة الشيفرة البرمجية الخاصة فيه إلى مكتبات ووحدات أقل حجمًا تؤدي وظائف معينة. الوحدة في بايثون عبارة عن ملف بايثون واحد يُمكن استيراده داخل ملف آخر، بينما المكتبات أو الحزم عبارة عن مجموعة وحدات. اذا كتبت شيفرة برمجية وحفظتها في ملف بايثون، فأنت فعليًا أنشات وحدة.

كيف نستورد مكتبة/وحدة في البايثون ؟

مثال، تتضمن البايثون وحدة معيارية مخصصة للعمليات الرياضية تُسمى math. المثال التالي يُوضح كيفية استيراد الوحدة عبر أمر import ومن ثم استدعاء دالة الجذر التربيعي sqrt منها:

[pastacode lang=”python” manual=”import%20math%0A%0Aprint(math.sqrt(16))%C2%A0%20%23%20%3D%3E%204.0″ message=”” highlight=”” provider=”manual”/]

يُمكننا استيراد دوال محددة من الوحدات التي نريد استخدامها. المثال التالي يُوضح كيفية استيراد دالتي ceil و floor من مكتبة math:

[pastacode lang=”python” manual=”from%20math%20import%20ceil%2C%20floor%0A%0Aprint(ceil(3.7))%C2%A0%C2%A0%20%23%20%3D%3E%204.0%0A%0Aprint(floor(3.7))%C2%A0%20%23%20%3D%3E%203.0″ message=”” highlight=”” provider=”manual”/]

يُمكننا استيراد جميع الدوال من الوحدة دفعة واحدة:

[pastacode lang=”python” manual=”from%20math%20import%20*” message=”” highlight=”” provider=”manual”/]

ولكن هذه الطريقة لا يُنصح بها، وننصحك بأن تتعود على استيراد الدوال التي تحتاجها فقط.

في بعض الأحيان تكون بعض أسماء الوحدات طويلة وتُسبب ازعاجًا للمبرمج عند استدعاءها، لذلك يُوجد عُرف لدى مبرمجي البايثون بأنهم يعملون على اختصار أسماء الوحدات عند استيرادها بكتابة أسماء مختصرة لها كما يلي:

[pastacode lang=”python” manual=”import%20math%20as%20m%0A%0Amath.sqrt(16)%20%3D%3D%20m.sqrt(16)%C2%A0%20%23%20%3D%3E%20True” message=”” highlight=”” provider=”manual”/]

محلاظة هامة: إذا كان لديك ملف بايثون باسم math في نفس المجلد الذي يوجد به ملف العمل الخاص بك، فإن الملف math هو الذي سيتم تحميله واستيراده بدلا من الوحدة المعيارية المضمنة في البايثون باسم math ذلك لأن الأولوية في حال تشابه الأسماء هي للملفات في مجلد العمل المحلي أو الحالي.

في الختام

 نتمنى أن نكون وُفقنا في إيصال المعلومة بالشكل الصحيح حول موضوع الدوال والوحدات في بايثون ونسعد بأي ملاحظة في التعليقات. كما نتمنى منكم مشاركة مقالات بايثونات في منصات التواصل الاجتماعي مثل تويتر وفيسبوك حتى تعم الفائدة.

مقالات مشابهة

  • 7 طرق عليك تعلمها لتحسين اختبار البرمجيات

    7 طرق عليك تعلمها لتحسين اختبار البرمجيات

    هل تبحث عن طرق لتحسين اختبار البرمجيات وجعل تلك العملية أكثر كفاءةً وسرعةً مما
    ابراهيم البحيصي
    By ابراهيم البحيصي
    تعرف على المزيد
  • التعامل مع دوال بايثون - بايثونات

    المزخرفات في بايثون – كيف نتعامل مع دوال بايثون بحُرية أكثر

    المزخرفات في بايثون أو باللغة الانجليزية Decorators هي أحد أقوى وأجمل خصائص لغة البرمجة
    ابراهيم البحيصي
    By ابراهيم البحيصي
    تعرف على المزيد
  • كتابة كود بايثون اون لاين بطريقة سليمة - بايثونات

    البرمجة البايثونية – كيف تكتب شيفرة برمجية بالبايثون بطريقة سليمة

    البرمجة بطريقة بايثونية Pythonic Way هو مصطلح يُشير إلى طريقة كتابة الشيفرة البرمجية بالبايثون
    ابراهيم البحيصي
    By ابراهيم البحيصي
    تعرف على المزيد
  • تعلم بايثون خطوة بخطوة - البرمجة الكائنية - بايثونات

    البرمجة الكائنية في بايثون – سلسلة بايثونات لتعلم لغة البايثون

    أهلا وسهلًا بكم في آخر مقال من سلسلة بايثونات لتعلم البايثون والذي نتناول فيه
    ابراهيم البحيصي
    By ابراهيم البحيصي
    تعرف على المزيد

One Comment

  1. لو تكرمت يا دكتور نزل المكاتب الخاصه بالغة البايثون مع الدوال الخاصه بكل مكتبه مع عمل كل داله

Comments are closed.