الفصل : 8
الجزء : 2
العنوان : ال FUNCTIONS
قيم الإرجاع (Return Values)
الدالة ليست مضطرة دائمًا لعرض ناتجها مباشرة. بدلاً من ذلك، يمكنها معالجة بعض البيانات ثم إرجاع قيمة أو مجموعة من القيم. القيمة التي ترجعها الدالة تُسمى قيمة الإرجاع. جملة `return` تأخذ قيمة من داخل الدالة وترسلها مرة أخرى إلى السطر الذي استدعى الدالة. قيم الإرجاع تسمح لك بنقل معظم العمل الشاق في برنامجك إلى الدوال، مما يمكن أن يبسط جسم البرنامج.
إرجاع قيمة بسيطة
لننظر إلى دالة تأخذ الاسم الأول واسم العائلة، وترجع اسمًا كاملاً بشكل منسق:
تعريف الدالة `get_formatted_name()` يأخذ كمعاملات الاسم الأول واسم العائلة. الدالة تجمع هذين الاسمين، تضيف بينهما مسافة، وتعين النتيجة إلى `full_name`. قيمة `full_name` تُحول إلى حالة العنوان (title case)، ثم تُرجع إلى السطر الذي استدعى الدالة.
عندما تستدعي دالة تُرجع قيمة، تحتاج إلى توفير متغير يمكن تعيين قيمة الإرجاع إليه. في هذه الحالة، تُعين القيمة المُرجعة إلى المتغير `musician`. الناتج يعرض اسمًا منسقًا بشكل جيد مكونًا من أجزاء اسم الشخص:
قد يبدو هذا الكثير من العمل للحصول على اسم منسق عندما كان بإمكاننا ببساطة كتابة:
ومع ذلك، عندما تفكر في العمل مع برنامج كبير يحتاج إلى تخزين العديد من الأسماء الأولى وأسماء العائلة بشكل منفصل، تصبح الدوال مثل `get_formatted_name()` مفيدة جدًا. تخزن الأسماء الأولى وأسماء العائلة بشكل منفصل ثم تستدعي هذه الدالة .كلما أردت عرض اسم كامل.
جعل المعامل اختياري
أحيانًا يكون من المنطقي جعل المعامل اختياريًا، بحيث يمكن للأشخاص الذين يستخدمون الدالة اختيار تقديم معلومات إضافية فقط إذا أرادوا ذلك. يمكنك استخدام القيم الافتراضية لجعل المعامل اختياريًا.
على سبيل المثال، لنفترض أننا نريد توسيع دالة `get_formatted_name()` لتتعامل مع الأسماء الوسطى أيضًا. المحاولة الأولى لتضمين الأسماء الوسطى قد تبدو هكذا:
هذه الدالة تعمل عند إعطائها اسمًا أول، واسمًا وسطى، واسم عائلة. تأخذ الدالة جميع الأجزاء الثلاثة للاسم ثم تبني سلسلة نصية منها. تضيف الدالة مسافات حيثما يلزم وتُحول الاسم الكامل إلى حالة العنوان (title case):
لكن الأسماء الوسطى ليست دائمًا ضرورية، وهذه الدالة كما هي مكتوبة لن تعمل إذا حاولت استدعاءها باسم أول واسم عائلة فقط. لجعل الاسم الوسطى اختياريًا، يمكننا إعطاء المعامل `middle_name` قيمة افتراضية فارغة وتجاهل المعامل إلا إذا قدم المستخدم قيمة. لجعل `get_formatted_name()` تعمل بدون اسم وسطى، نضع القيمة الافتراضية للمعامل `middle_name` كـ سلسلة نصية فارغة ونحركه إلى نهاية قائمة المعاملات:
في هذا المثال، يتم بناء الاسم من ثلاثة أجزاء ممكنة. لأن هناك دائمًا اسم أول واسم عائلة، يتم سرد هذه المعاملات أولاً في تعريف الدالة. الاسم الوسطى اختياري، لذا يتم إدراجه آخرًا في التعريف، وقيمته الافتراضية هي سلسلة نصية فارغة.
في جسم الدالة، نتحقق مما إذا كان قد تم تقديم اسم وسطى. بايثون تفسر السلاسل النصية غير الفارغة على أنها True، لذا فإن الاختبار الشرطي `if middle_name` يُقيم على أنه True إذا كان هناك معامل للاسم الوسطى في استدعاء الدالة. إذا تم تقديم اسم وسطى، يتم جمع الأسماء الأول، الوسطى، والعائلة لتشكيل اسم كامل. يتم تحويل هذا الاسم إلى حالة العنوان ثم يُرجع إلى السطر الذي استدعى الدالة، حيث يتم تعيينه إلى المتغير `musician` ويُطبع. إذا لم يتم تقديم اسم وسطى، تفشل السلسلة النصية الفارغة في اختبار if ويتم تشغيل الكتلة else. يتم بناء الاسم الكامل فقط بالاسم الأول واسم العائلة، والاسم المنسق يُرجع إلى السطر الذي استدعى الدالة حيث يتم تعيينه إلى `musician` ويُطبع.
استدعاء هذه الدالة باستخدام اسم أول واسم عائلة هو أمر بسيط. إذا كنا نستخدم اسمًا وسطى، مع ذلك، يجب أن نتأكد من أن الاسم الوسطى هو آخر معامل يُمرر حتى تتطابق المعاملات الموضعية بشكل صحيح:
هذا الإصدار المعدل من الدالة يعمل للأشخاص الذين لديهم اسم أول واسم عائلة فقط، ويعمل للأشخاص الذين لديهم اسم وسطى أيضًا:
القيم الاختيارية تسمح للدوال بمعالجة مجموعة واسعة من حالات الاستخدام بينما تظل استدعاءات الدوال بسيطة قدر الإمكان.
إرجاع قاموس (Dictionary)
الدالة يمكن أن تُرجع أي نوع من القيم التي تحتاجها، بما في ذلك الهياكل البيانية المعقدة مثل القوائم (lists) والقواميس (dictionaries). على سبيل المثال، الدالة التالية تأخذ أجزاء من الاسم وترجع قاموسًا يمثل الشخص:
الدالة `build_person()` تأخذ اسمًا أول واسم عائلة، وتضع هذه القيم في قاموس. قيمة `first_name` تُخزن بالمفتاح 'first'، وقيمة `last_name` تُخزن بالمفتاح 'last'. ثم يتم إرجاع القاموس الكامل الذي يمثل الشخص. قيمة الإرجاع تُطبع باستخدام القطعتين الأصليتين من المعلومات النصية التي تُخزن الآن في قاموس:
هذه الدالة تأخذ معلومات نصية بسيطة وتضعها في هيكل بيانات أكثر معنىً يتيح لك العمل مع المعلومات بما يتجاوز مجرد طباعتها. السلاسل النصية 'jimi' و 'hendrix' تُسمى الآن كاسم أول واسم عائلة. يمكنك بسهولة توسيع هذه الدالة لقبول قيم اختيارية مثل اسم وسطى، عمر، مهنة، أو أي معلومات أخرى تريد تخزينها عن الشخص. على سبيل المثال، التغيير التالي يتيح لك تخزين عمر الشخص أيضًا:
نضيف معاملًا اختياريًا جديدًا `age` إلى تعريف الدالة ونعين للمعامل القيمة الخاصة None، والتي تُستخدم عندما لا يكون للمتغير قيمة محددة معينة. يمكنك اعتبار None كقيمة نائب. في الاختبارات الشرطية، تُقيم None كـ False. إذا تضمن استدعاء الدالة قيمة لـ `age`، تُخزن تلك القيمة في القاموس. هذه الدالة دائمًا تخزن اسم الشخص، لكنها يمكن أيضًا أن تُعدل لتخزين أي معلومات أخرى تريدها عن الشخص.
استخدام الدالة مع حلقة while
يمكنك استخدام الدوال مع جميع تراكيب بايثون التي تعلمتها حتى الآن. على سبيل المثال، لنستخدم الدالة `get_formatted_name()` مع حلقة while لتحية المستخدمين بشكل أكثر رسمية. إليك أول محاولة لتحية الأشخاص باستخدام أسمائهم الأولى واسم العائلة:
في هذا المثال، نستخدم إصدارًا بسيطًا من `get_formatted_name()` الذي لا يشمل الأسماء الوسطى. تطلب حلقة while من المستخدم إدخال اسمه، ونطالب بالاسم الأول واسم العائلة بشكل منفصل.
لكن هناك مشكلة واحدة مع هذه الحلقة while: لم نحدد شرطًا للخروج. أين تضع شرط الخروج عندما تطلب سلسلة من المدخلات؟ نريد أن يكون للمستخدم القدرة على الخروج بأكبر قدر ممكن من السهولة، لذا يجب أن يقدم كل مطالبة (prompt) طريقة للخروج. جملة `break` تقدم طريقة مباشرة للخروج من الحلقة في أي من المدخلتين:
نضيف رسالة تُعلم المستخدم كيف يخرج، ثم نخرج من الحلقة إذا أدخل المستخدم قيمة الخروج في أي من المدخلتين. الآن البرنامج سيستمر في تحية الأشخاص حتى يدخل شخص ما 'q' لأي من الأسماء:
جربها بنفسك
تمرين 8-6. أسماء المدن:** اكتب دالة تُسمى `city_country()` تأخذ اسم المدينة واسم الدولة. يجب أن تُرجع الدالة سلسلة نصية منسقة مثل هذه: "Santiago, Chile". استدعِ دالتك مع ثلاثة أزواج من المدينة والدولة على الأقل، واطبع القيم التي تُرجعها.
تمرين 8-7. ألبوم:** اكتب دالة تُسمى `make_album()` تبني قاموسًا يصف ألبوم موسيقي. يجب أن تأخذ الدالة اسم الفنان وعنوان الألبوم، ويجب أن تُرجع قاموسًا يحتوي على هاتين القطعتين من المعلومات. استخدم الدالة لإنشاء ثلاثة قواميس تمثل ألبومات مختلفة. اطبع كل قيمة مُرجعة لتُظهر أن القواميس تُخزن معلومات الألبوم بشكل صحيح. استخدم None لإضافة معامل اختياري إلى `make_album()` يتيح لك تخزين عدد الأغاني في الألبوم. إذا تضمن السطر الذي يستدعي الدالة قيمة لعدد الأغاني، أضف تلك القيمة إلى قاموس الألبوم. أنشئ استدعاءً جديدًا واحدًا على الأقل للدالة يتضمن عدد الأغاني في الألبوم.
تمرين 8-8. ألبومات المستخدم:** ابدأ ببرنامجك من التمرين 8-7. اكتب حلقة while تتيح للمستخدمين إدخال فنان الألبوم وعنوان الألبوم. بمجرد حصولك على تلك المعلومات، استدعِ `make_album()` باستخدام مدخلات المستخدم واطبع القاموس الذي يُنشأ. تأكد من تضمين قيمة الخروج في الحلقة while.
تمرير قائمة
غالباً ما ستجد أنه من المفيد تمرير قائمة إلى دالة، سواء كانت قائمة بالأسماء أو الأرقام أو كائنات أكثر تعقيداً مثل القواميس. عند تمرير قائمة إلى دالة، تحصل الدالة على وصول مباشر إلى محتويات القائمة. دعونا نستخدم الدوال لجعل العمل مع القوائم أكثر كفاءة.
افترض أن لدينا قائمة بالمستخدمين ونريد طباعة تحية لكل واحد منهم. المثال التالي يرسل قائمة بالأسماء إلى دالة تسمى `greet_users()`، والتي تحيي كل شخص في القائمة بشكل فردي:
نحن نعرف الدالة `greet_users()` بحيث تتوقع قائمة بالأسماء، والتي تقوم بتعيينها للمتغير `names`. تقوم الدالة بالتكرار خلال القائمة التي تتلقاها وتطبع تحية لكل مستخدم. خارج الدالة، نحدد قائمة من المستخدمين ثم نمرر قائمة `usernames` إلى `greet_users()` في استدعاء الدالة:
هذا هو المخرج الذي أردناه. كل مستخدم يرى تحية مخصصة، ويمكنك استدعاء الدالة في أي وقت تريد فيه تحية مجموعة محددة من المستخدمين.
تعديل قائمة في دالة
عند تمرير قائمة إلى دالة، يمكن للدالة تعديل القائمة. أي تغييرات تُجرى على القائمة داخل جسم الدالة تكون دائمة، مما يتيح لك العمل بكفاءة حتى عند التعامل مع كميات كبيرة من البيانات.
افترض أن هناك شركة تصنع نماذج مطبوعة بتقنية 3D من تصاميم يقدمها المستخدمون. التصاميم التي تحتاج إلى الطباعة تُخزن في قائمة، وبعد الطباعة تُنقل إلى قائمة منفصلة. الكود التالي يفعل ذلك بدون استخدام الدوال:
يبدأ هذا البرنامج بقائمة من التصاميم التي تحتاج إلى الطباعة وقائمة فارغة تسمى `completed_models` حيث سيتم نقل كل تصميم بعد أن يتم طباعته. طالما أن هناك تصاميم في `unprinted_designs`، فإن الحلقة `while` تحاكي طباعة كل تصميم عن طريق إزالة تصميم من نهاية القائمة، وتخزينه في `current_design`، وعرض رسالة بأن التصميم الحالي يتم طباعته. ثم يضيف التصميم إلى قائمة النماذج المكتملة. عند الانتهاء من الحلقة، يتم عرض قائمة بالنماذج التي تم طباعتها:
يمكننا إعادة تنظيم هذا الكود بكتابة دالتين، كل منهما تؤدي وظيفة محددة. معظم الكود لن يتغير؛ نحن فقط نقوم بترتيبه بعناية أكبر. الدالة الأولى ستتعامل مع طباعة التصاميم، والثانية ستلخص النماذج التي تم طباعتها:
نحن نعرف الدالة `print_models()` بمتغيرين: قائمة التصاميم التي تحتاج إلى الطباعة وقائمة النماذج المكتملة ❶. بالنظر إلى هاتين القائمتين، تحاكي الدالة طباعة كل تصميم عن طريق إفراغ قائمة التصاميم غير المطبوعة وملء قائمة النماذج المكتملة. ثم نعرف الدالة `show_completed_models()` بمتغير واحد: قائمة النماذج المكتملة ❷. بالنظر إلى هذه القائمة، تعرض `show_completed_models()` اسم كل نموذج تم طباعته.
هذا البرنامج له نفس المخرج كالإصدار بدون الدوال، ولكن الكود أكثر تنظيماً بكثير. الكود الذي يقوم بمعظم العمل تم نقله إلى دالتين منفصلتين، مما يجعل الجزء الرئيسي من البرنامج أسهل في الفهم. انظر إلى جسم البرنامج ولاحظ كيف يمكنك بسهولة متابعة ما يحدث:
نقوم بإعداد قائمة من التصاميم غير المطبوعة وقائمة فارغة ستحتوي على النماذج المكتملة. ثم، لأننا قد عرفنا بالفعل دالتينا، كل ما علينا فعله هو استدعاؤهما وتمرير المتغيرات الصحيحة. نستدعي `print_models()` ونمرر القائمتين اللتين تحتاجهما؛ كما هو متوقع، تقوم `print_models()` بمحاكاة طباعة التصاميم. ثم نستدعي `show_completed_models()` ونمرر لها قائمة النماذج المكتملة حتى تتمكن من الإبلاغ عن النماذج التي تم طباعتها. الأسماء الوصفية للدوال تسمح للآخرين بقراءة هذا الكود وفهمه، حتى بدون تعليقات.
هذا البرنامج أسهل في التمديد والصيانة من الإصدار بدون دوال. إذا احتجنا لطباعة المزيد من التصاميم لاحقاً، يمكننا ببساطة استدعاء `print_models()` مرة أخرى. إذا أدركنا أن كود الطباعة بحاجة إلى تعديل، يمكننا تغيير الكود مرة واحدة، وستحدث تغييراتنا في كل مكان يتم فيه استدعاء الدالة. هذه التقنية أكثر كفاءة من الاضطرار إلى تحديث الكود بشكل منفصل في عدة أماكن في البرنامج.
هذا المثال يوضح أيضاً فكرة أن كل دالة يجب أن تكون لها وظيفة محددة واحدة. الدالة الأولى تطبع كل تصميم، والثانية تعرض النماذج المكتملة. هذا أكثر فائدة من استخدام دالة واحدة للقيام بكلتا الوظيفتين. إذا كنت تكتب دالة ولاحظت أن الدالة تقوم بعدة مهام مختلفة، حاول تقسيم الكود إلى دالتين. تذكر أنه يمكنك دائماً استدعاء دالة من دالة أخرى، وهو ما يمكن أن يكون مفيداً عند تقسيم مهمة معقدة إلى سلسلة من الخطوات.
منع دالة من تعديل قائمة
أحياناً قد ترغب في منع دالة من تعديل قائمة. على سبيل المثال، افترض أنك تبدأ بقائمة من التصاميم غير المطبوعة وتكتب دالة لنقلها إلى قائمة النماذج المكتملة، كما في المثال السابق. قد تقرر أنه على الرغم من أنك قد طبعت جميع التصاميم، تريد الاحتفاظ بالقائمة الأصلية للتصاميم غير المطبوعة لسجلاتك. ولكن لأنك قمت بنقل جميع أسماء التصاميم من `unprinted_designs`، القائمة الآن فارغة، والقائمة الفارغة هي النسخة الوحيدة التي لديك؛ الأصلية قد ذهبت. في هذه الحالة، يمكنك معالجة هذه المشكلة بتمرير نسخة من القائمة إلى الدالة، وليس الأصل. أي تغييرات تقوم بها الدالة على القائمة ستؤثر فقط على النسخة، تاركة القائمة الأصلية سليمة.
يمكنك إرسال نسخة من قائمة إلى دالة بهذا الشكل:
الترميز `[:]` ينشئ نسخة من القائمة لإرسالها إلى الدالة. إذا لم نكن نريد إفراغ قائمة التصاميم غير المطبوعة في `printing_models.py`، يمكننا استدعاء `print_models()` بهذا الشكل:
الدالة `print_models()` يمكنها القيام بعملها لأنها لا تزال تتلقى أسماء جميع التصاميم غير المطبوعة. ولكن هذه المرة تستخدم نسخة من قائمة التصاميم غير المطبوعة الأصلية، وليس القائمة الفعلية `unprinted_designs`. قائمة `completed_models` ستمتلئ بأسماء النماذج المطبوعة كما كان من قبل، ولكن قائمة التصاميم غير المطبوعة الأصلية لن تتأثر بالدالة.
على الرغم من أنه يمكنك الحفاظ على محتويات قائمة عن طريق تمرير نسخة منها إلى دوالك، يجب أن تمرر القائمة الأصلية إلى الدوال ما لم يكن لديك سبب محدد لتمرير نسخة. من الأكثر كفاءة لدالة العمل مع قائمة موجودة، لأن هذا يتجنب استخدام الوقت والذاكرة اللازمة لإنشاء نسخة منفصلة. هذا صحيح بشكل خاص عند العمل مع قوائم كبيرة.
جرب بنفسك
تمرين 8-9. رسائل: أنشئ قائمة تحتوي على سلسلة من الرسائل النصية القصيرة. مرر القائمة إلى دالة تسمى `show_messages()`، التي تطبع كل رسالة نصية.
تمرين 8-10. إرسال الرسائل: ابدأ بنسخة من برنامجك من تمرين 8-9. اكتب دالة تسمى `send_messages()` التي تطبع كل رسالة نصية وتنقل كل رسالة إلى قائمة جديدة تسمى `sent_messages` أثناء طباعتها. بعد استدعاء الدالة، اطبع كلا القائمتين للتأكد من أن الرسائل قد تم نقلها بشكل صحيح.
تمرين 8-11. رسائل مؤرشفة: ابدأ بعملك من تمرين 8-10. استدع الدالة `send_messages()` بنسخة من قائمة الرسائل. بعد استدعاء الدالة، اطبع كلا القائمتين لتظهر أن القائمة الأصلية قد احتفظت برسائلها.
تمرير عدد غير محدد من المعاملات
في بعض الأحيان، لن تعرف مسبقًا عدد المعاملات التي يحتاجها الدالة لقبولها. لحسن الحظ، يسمح لك Python بجمع عدد غير محدد من المعاملات من بيان الاستدعاء.
على سبيل المثال، ضع في اعتبارك دالة تقوم بإعداد بيتزا. تحتاج إلى قبول عدد من الإضافات، ولكن لا يمكنك معرفة مسبقًا عدد الإضافات التي يريدها الشخص. الدالة في المثال التالي لديها معلمة واحدة، *toppings، ولكن هذه المعلمة تجمع أكبر عدد من المعاملات كما يوفرها سطر الاستدعاء:
تخبر النجمة في اسم المعلمة *toppings الى Python بإنشاء tuple يسمى toppings، يحتوي على جميع القيم التي تتلقاها هذه الدالة. ينتج استدعاء print() في جسم الدالة مخرجات توضح أن Python يمكنه التعامل مع استدعاء دالة بقيمة واحدة واستدعاء بثلاث قيم. يعالج Python المكالمات المختلفة بشكل مماثل. لاحظ أن Python يجمع الوسائط في tuple، حتى إذا استلمت الدالة قيمة واحدة فقط:
الآن يمكننا استبدال استدعاء print() بحلقة تمر عبر قائمة الإضافات وتصف البيتزا التي يتم طلبها:
ت ستجيب الدالة بشكل مناسب، سواء استلمت قيمة واحدة أو ثلاث قيم:
يعمل هذا التدوين بغض النظر عن عدد المعاملات التي تتلقاها الدالة.
خلط المعاملات الموضعية وغير المحددة
إذا كنت تريد أن تقبل الدالة عدة أنواع مختلفة من المعاملات، يجب وضع المعلمة التي تقبل عددًا غير محدد من المعاملات في النهاية في تعريف الدالة. يطابق Python أولاً المعاملات الموضعية وكلمات المفتاح ثم يجمع أي وسائط متبقية في المعلمة الأخيرة.
على سبيل المثال، إذا كانت الدالة تحتاج إلى استقبال حجم للبيتزا، فيجب أن تأتي هذه المعلمة قبل المعلمة *toppings:
في تعريف الدالة، يخصص Python القيمة الأولى التي يتلقاها إلى معلمة size. يتم تخزين جميع القيم الأخرى التي تأتي بعد ذلك في tuple toppings. تتضمن استدعاءات الدالة وسيطة للحجم أولاً، متبوعة بأكبر عدد ممكن من الإضافات حسب الحاجة.
الآن تحتوي كل بيتزا على حجم وعدد من الإضافات، ويتم طباعة كل معلومة في المكان المناسب، حيث يتم عرض الحجم أولاً ثم الإضافات بعد ذلك:
استخدام المعاملات غير المحددة لكلمات المفتاح
في بعض الأحيان، قد ترغب في قبول عدد غير محدد من الوسائط، ولكنك لن تعرف مسبقًا نوع المعلومات التي سيتم تمريرها إلى الدالة. في هذه الحالة، يمكنك كتابة دوال تقبل أكبر عدد من الأزواج مفتاح-قيمة كما يوفرها بيان الاستدعاء. أحد الأمثلة يتضمن إنشاء ملفات تعريف المستخدمين: تعرف أنك ستحصل على معلومات حول المستخدم، ولكنك لست متأكدًا من نوع المعلومات التي ستتلقاها. الدالة build_profile() في المثال التالي تأخذ دائمًا اسمًا أول واسمًا أخيرًا، ولكنها تقبل عددًا غير محدد من الوسائط الإضافية كأزواج مفتاح-قيمة أيضًا:
يتوقع تعريف build_profile() اسمًا أول واسمًا أخيرًا، ثم يسمح للمستخدم بتمرير أكبر عدد من الأزواج مفتاح-قيمة كما يرغب. تؤدي النجمتان المزدوجتان قبل المعلمة **user_info إلى إنشاء Python لقاموس يسمى user_info يحتوي على جميع الأزواج مفتاح-قيمة الإضافية التي تتلقاها الدالة. داخل الدالة، يمكنك الوصول إلى الأزواج مفتاح-قيمة في user_info تمامًا كما تفعل مع أي قاموس.
في جسم build_profile()، نضيف الأسماء الأولى والأخيرة إلى قاموس user_info لأننا سنتلقى هاتين المعلومتين دائمًا من المستخدم، ولم يتم وضعهما في القاموس بعد. ثم نعيد قاموس user_info إلى سطر استدعاء الدالة.
نستدعي build_profile()، مع تمرير الاسم الأول 'albert'، والاسم الأخير 'einstein'، واثنين من الأزواج مفتاح-قيمة location='princeton' وfield='physics'. نعين الملف الشخصي المعاد إلى user_profile ونعرض user_profile:
يحتوي القاموس المعاد على الأسماء الأولى والأخيرة للمستخدم، وفي هذه الحالة، الموقع ومجال الدراسة أيضًا. ستعمل الدالة بغض النظر عن عدد الأزواج مفتاح-قيمة الإضافية التي تم توفيرها في استدعاء الدالة.
يمكنك خلط القيم الموضعية، وكلمات المفتاح، والقيم غير المحددة بعدة طرق مختلفة عند كتابة دوالك الخاصة. من المفيد معرفة أن جميع أنواع الوسائط هذه موجودة لأنك ستراها كثيرًا عندما تبدأ في قراءة شيفرة الآخرين. يتطلب الأمر ممارسة لاستخدام الأنواع المختلفة بشكل صحيح ومعرفة متى تستخدم كل نوع. في الوقت الحالي، تذكر استخدام النهج الأبسط الذي ينجز المهمة. مع تقدمك، ستتعلم استخدام النهج الأكثر كفاءة في كل مرة.
جرب بنفسك
تمرين 8-12. السندويشات: اكتب دالة تقبل قائمة من العناصر التي يريدها الشخص في السندويش. يجب أن تحتوي الدالة على معلمة واحدة تجمع أكبر عدد ممكن من العناصر كما يوفرها استدعاء الدالة، ويجب أن تطبع ملخصًا للسندويش الذي يتم طلبه. استدع الدالة ثلاث مرات، باستخدام عدد مختلف من الوسائط في كل مرة.
تمرين 8-13. ملف المستخدم: ابدأ بنسخة من user_profile.py من الصفحة 148. قم بإنشاء ملف شخصي لنفسك عن طريق استدعاء build_profile()، باستخدام اسمك الأول والأخير وثلاثة أزواج مفتاح-قيمة أخرى تصفك.
تمرين 8-14. السيارات: اكتب دالة تخزن معلومات حول سيارة في قاموس. يجب أن تتلقى الدالة دائمًا مصنع السيارة واسم الطراز. بعد ذلك يجب أن تقبل عددًا غير محدد من الأزواج مفتاح-قيمة. استدع الدالة بالمعلومات المطلوبة واثنين من الأزواج مفتاح-قيمة الأخرى، مثل اللون أو ميزة اختيارية. يجب أن تعمل دالتك لاستدعاء مثل هذا:
اعرض القاموس الذي تم إرجاعه للتأكد من تخزين جميع المعلومات بشكل صحيح.
النهاية
نكون هنا انتهينا من الجزء 2 من الفصل 8 من منهج تعلم Python من كتاب python crash course بالعربية
واذا واجهتك اي مشكلة في الفهم او ما شابه , يمكنك على الفور الذهاب الى المجتمع الخاص بنا في Telegram للمناقشة والتواصل معنا من هنا
او اذا واجهتك مشكلة في الموقع او تريد اجابة سريعة يمكنك الذهاب الى اخر صفحة في الموقع ستجد صفحة اتصل بنا موجودة يمكنك ارسالة لنا مشكلتك , وسيتم الرد عليها بسرعة جدا ان شاء الله
ويمكنك الأنضمام الى المجتمع Hidden Lock بالكامل مع جميع قنواته للأستفادة في اخر الأخبار في عالم التقنية وايضا الكتب بالمجان والكورسات والمقالات من خلال الرابط التالي لمجموعة القنوات من هنا
يمكنك ايضا متابعتنا في منصات X او Twitter سابقا , لمشاهدة الاخبار والمقالات السريعة والمهمة من
وفقط كان معكم sparrow مقدم هذه الشهادة من فريق Hidden Lock