المقدمة
Python هي واحدة من أكثر لغات البرمجة شعبية في جميع أنحاء العالم. في Python، تعد المعلمات (parameters) جزءًا من تعريفات الدوال. وهي تمكنك من تحديد وسائط (arguments) معينة للدالة. ويمكن للدالة قبول الوسيط وتطبيقه.
ومع ذلك، ليس من الممكن لك أن تعرف في وقت كتابة الكود ما هي حالات الاستخدام الدقيقة التي قد يتم تنفيذها باستخدام الكود الخاص بك. على هذا النحو، ومن أجل المبرمجين والمستخدمين المستقبليين لبرنامجك، يُنصح بتمرير عدد متغير من الوسائط إلى الدالة. للقيام بذلك، يجب عليك استخدام معلمات خاصة. هذه المعلمات هي *args و **kwargs. في هذا الدرس التعليمي، سوف نتعلم كل شيء عن معلمات *args و **kwargs في Python. سنتعلم أيضًا كيفية ترتيب الوسائط وكيفية تطبيقها في استدعاءات الدوال.
المتطلبات الأساسية
لكي تتمكن من اتباع الخطوات الواردة في الدرس التعليمي، هناك بعض المتطلبات الأساسية التي تحتاج إلى إعدادها. أولاً، يجب أن يكون لديك Python 3 مثبتًا على خادمك مع بيئة برمجة جاهزة وتعمل. تحتاج أيضًا إلى تثبيت البرنامج الخاص بنظام التشغيل المحدد لديك (Ubuntu, CentOS، Debian، وما إلى ذلك).
ما هو *args وكيف يعمل؟
دعونا نبدأ بفهم كيف يعمل *args . يُستخدم إصدار النجمة الفردية للمعلمة لإرسال قوائم وسائط متغيرة الطول غير مسماة إلى الدوال. ضع في اعتبارك أن النجمة هي العنصر الأكثر أهمية في هذه المعلمة.
لفهم الأمر بشكل أفضل، دعونا نلقي نظرة على مثال. فيما يلي دالة نموذجية قد تجدها في الكود الخاص بك، وتستخدم وسيطين:
|
1 2 |
def multiply(x, y): print (x * y) |
كما ترى، فإن الوسائط الخاصة بنا في الدالة أعلاه هي x و y. عند استدعاء الدالة، ستستخدم أرقامًا تقابل x و y. لنفترض أننا نقوم بتمرير الأعداد الصحيحة 5 و 4 لـ x و y على التوالي:
|
1 2 3 4 |
def multiply(x, y): print (x * y) multiply(5, 4) |
الآن يمكننا تشغيل الكود:
|
1 |
python lets_multiply.py |
المخرجات التي سنحصل عليها ستكون كما يلي:
|
1 2 3 |
Output: 20 |
توضح المخرجات أنه قد تم ضرب العددين الصحيحين 5 و 4. وهذا يعني أن دالة multiply(x, y) قد عملت بنجاح.
الآن، لنفترض أننا نريد في النهاية ضرب ثلاثة أرقام بدلاً من رقمين فقط. لسوء الحظ، فإن إضافة رقم إضافي إلى الدالة أعلاه ستؤدي إلى حدوث خطأ مثل هذا:
|
1 2 3 4 |
def multiply(x, y): print (x * y) multiply(5, 4, 3) |
|
1 2 3 |
Output: TypeError: multiply() takes 2 positional arguments but 3 were given |
لذلك، إذا كان لديك فكرة بأنك قد تحتاج إلى إضافة المزيد من الوسائط في وقت لاحق، فقم بتطبيق معلمة *args لراحتك. يمكنك استخدامها على النحو التالي:
|
1 2 3 4 5 6 7 8 9 10 |
def multiply(*args): z = 1 for num in args: z *= num print(z) multiply(4, 5) multiply(10, 9) multiply(2, 3, 4) multiply(3, 5, 10, 6) |
لقد قمنا ببساطة باستبدال معلمات الدالة x و y بـ *args. سيؤدي تشغيل هذا الكود إلى إعطائك حاصل الضرب لكل استدعاء دالة على النحو التالي:
|
1 2 3 4 5 6 |
Output: 20 90 24 900 |
وبالتالي، فإن *args مثالية للاستخدام عندما تريد إرسال قوائم وسائط متغيرة الطول إلى دالتك. وبفضل قدرتها، يمكنك تمرير أي عدد تريده من الوسائط إلى استدعاءات الدوال. على هذا النحو، تتيح لك هذه المعلمة بناء كود أكثر مرونة يمكنه قبول كمية جيدة من الوسائط المتغيرة غير المسماة في الدالة.
ما هو **kwargs وكيف يعمل؟
بعد ذلك، لدينا إصدار النجمة المزدوجة من المعلمات وهو **kwargs. على عكس الشكل السابق، تتيح لك هذه المعلمة تمرير قواميس وسائط مسماة ومتغيرة الطول إلى الدالة. على غرار *args، النجمتان المزدوجتان هما العنصر الأكثر أهمية في المعلمة.
كما فعلنا في القسم السابق، يمكنك إضافة أي عدد تريده من الوسائط. الفرق هو أنه يجب عليك تعيين كلمات مفتاحية. لفهم الأمر بشكل أفضل، تأمل المثال التالي. هنا، سنبدأ بطباعة **kwargs التي نريد تمريرها إلى الدالة:
|
1 2 |
def print_kwargs(**kwargs): print(kwargs) |
الآن، دعنا نستدعي الدالة. كما ترى، قمنا بإضافة وسائط الكلمات المفتاحية:
|
1 2 3 4 |
def print_kwargs(**kwargs): print(kwargs) print_kwargs(kwargs_1="Shark", kwargs_2=4.5, kwargs_3=True) |
تشغيل البرنامج في هذه المرحلة سيظهر لك هذا المخرج:
|
1 |
python print_kwargs.py |
|
1 2 3 |
المخرج: {'kwargs_3': True, 'kwargs_2': 4.5, 'kwargs_1': 'Shark'} |
ومع ذلك، هناك احتمال أن يكون نوع بيانات القاموس لديك غير مرتب. يعتمد هذا إلى حد كبير على إصدار Python 3 الذي تستخدمه. على سبيل المثال، أي إصدار بعد Python 3.6 يمنحك أزواج المفاتيح والقيم بالترتيب. أي إصدار يسبق ذلك سيعرض المخرج بترتيب عشوائي. القاموس الذي تقوم بإنشائه سيُسمى kwargs. لاحظ أنه يمكنك استخدامه ومعالجته مثل أي قاموس آخر على النظام. دعنا نرى كيف يمكنك استخدام معلمة **kwargs بشكل أكبر وتطبيقها على نطاق أوسع.
في المثال التالي، سنحاول إنشاء دالة جديدة ترحب بقاموس يحتوي على أسماء. سيكون لقاموسنا النموذجي اسمان:
|
1 2 3 4 5 |
def print_values(**kwargs): for key, value in kwargs.items(): print("إن قيمة {} هي {}".format(key, value)) print_values(my_name="Sammy", your_name="Casey") |
تشغيل البرنامج سيعطيك هذا المخرج:
|
1 |
python print_values.py |
|
1 2 3 4 |
المخرج: إن قيمة of your_name هي Casey إن قيمة of my_name هي Sammy |
على غرار المثال السابق، قد تظهر القواميس غير مرتبة. على هذا النحو، قد يتم عكس ترتيب الاسمين Casey و Sammy في بعض الحالات.
بعد ذلك، سنقوم بتمرير وسائط إضافية إلى الدالة. سيثبت هذا أنه يمكنك جعل **kwargs تقبل أي عدد تريده من الوسائط:
|
1 2 3 4 5 6 7 8 9 10 11 |
def print_values(**kwargs): for key, value in kwargs.items(): print("إن قيمة {} هي {}".format(key, value)) print_values( name_1="Alex", name_2="Gray", name_3="Harper", name_4="Phoenix", name_5="Remy", name_6="Val") |
تشغيل البرنامج سيظهر لك هذا المخرج:
|
1 2 3 4 5 6 7 8 |
المخرج: إن قيمة of name_2 هي Gray إن قيمة of name_6 هي Val إن قيمة of name_4 هي Phoenix إن قيمة of name_5 هي Remy إن قيمة of name_3 هي Harper إن قيمة of name_1 هي Alex |
قد يكون هذا المخرج أيضاً غير مرتب. بغض النظر عن ذلك، تظهر هذه الأمثلة أن **kwargs تمنح برنامجك المرونة لاستخدام عدد من وسائط الكلمات المفتاحية.
كيفية ترتيب الوسائط
من المهم أن تضع في اعتبارك الترتيب المحدد عند ترتيب الوسائط في دالة أو استدعاء دالة. وهو كما يلي:
-
الوسائط الموضعية الرسمية
-
*args
-
وسائط الكلمات المفتاحية
-
**kwargs
دعنا نفترض أنك تستخدم *args و **kwargs مع معلمات موضعية صريحة. هذا يعني أن دالتك ستبدو كالتالي:
|
1 2 |
def example(arg_1, arg_2, *args, **kwargs): ... |
من ناحية أخرى، فإن استخدام هذه المعلمات مع معلمات الكلمات المفتاحية المسماة سيعطي دالتك البنية العامة التالية:
|
1 2 |
def example2(arg_1, arg_2, *args, kw_1="shark", kw_2="blobfish", **kwargs): ... |
عدم الالتزام بالترتيب المحدد سيؤدي إلى حدوث خطأ في بناء الجملة (syntax error) عند تشغيل الكود الخاص بك. لذلك، من الأفضل تجنب ارتكاب هذا الخطأ في المقام الأول.
كيفية استخدام *args و **kwargs في استدعاءات الدوال
أخيرًا، سنوضح لك كيفية استخدام كلتا المعلمتين لتمرير الوسائط إلى الدوال. سنبدأ بمثال يوضح *args:
|
1 2 3 4 5 6 7 8 |
def some_args(arg_1, arg_2, arg_3): print("arg_1:", arg_1) print("arg_2:", arg_2) print("arg_3:", arg_3) args = ("Sammy", "Casey", "Alex") some_args(*args) |
هناك ثلاث معلمات في هذه الدالة: arg_1, arg_2، و arg_3. يجب عليك إنشاء متغير وتعيينه إلى كائن قابل للتكرار (iterable). في هذه الحالة، سيكون tuple. بعد ذلك، يمكنك تمرير المتغير إلى الدالة باستخدام صيغة النجمة.
لاحظ المخرجات عند تشغيل البرنامج باستخدام python some_args.py الأمر:
|
1 2 3 4 5 |
المخرجات: arg_1: Sammy arg_2: Casey arg_3: Alex |
من الممكن تغيير البرنامج إلى قائمة قابلة للتكرار (iterable list) نوع بيانات أيضًا مع اسم متغير مختلف. يجمع الكود التالي بين *args مع معلمة مسماة:
|
1 2 3 4 5 6 7 8 |
def some_args(arg_1, arg_2, arg_3): print("arg_1:", arg_1) print("arg_2:", arg_2) print("arg_3:", arg_3) my_list = [2, 3] some_args(1, *my_list) |
ستكون المخرجات على النحو التالي عند تشغيل البرنامج:
|
1 2 3 4 5 |
المخرجات: arg_1: 1 arg_2: 2 arg_3: 3 |
من ناحية أخرى، يمكنك تطبيق الوسائط ذات الكلمات المفتاحية باستخدام **kwargs. تأكد من إنشاء متغير يساوي قاموسًا (dictionary). يجب أن يحتوي على زوجين من المفاتيح والقيم. إليك كيفية تمرير المتغير إلى دالة تحتوي على 3 وسائط:
|
1 2 3 4 5 6 7 8 |
def some_kwargs(kwarg_1, kwarg_2, kwarg_3): print("kwarg_1:", kwarg_1) print("kwarg_2:", kwarg_2) print("kwarg_3:", kwarg_3) kwargs = {"kwarg_1": "Val", "kwarg_2": "Harper", "kwarg_3": "Remy"} some_kwargs(**kwargs) |
استخدم python some_kwargs.py الأمر مرة أخرى لتشغيل البرنامج:
|
1 2 3 4 5 |
المخرجات: kwarg_1: Val kwarg_2: Harper kwarg_3: Remy |
الخاتمة
بحلول نهاية هذا البرنامج التعليمي، يجب أن تكون على دراية جيدة بماهية *args و **kwargs وكيفية عملهما. يمكنك الآن تطبيق هذه المعلمات على الكود الخاص بك لجعل برنامجك مرنًا للمستخدمين في المستقبل. هذه المعلمات مثالية للحالات التي لا تكون فيها على دراية بعدد الوسائط التي قد يتم استخدامها. فقط تأكد من توخي الحذر بشأن العناصر الأساسية للدوال والمعلمات.
أخيرًا، إليك المزيد من الموارد من مدونتنا والتي ستساعدك على العمل بنجاح مع بايثون:
- تنسيق ملف txt: العمل مع ملفات النصوص العادية في بايثون 3
- الحلقات التكرارية في بايثون 3: استخدام عبارات Break و Continue و Pass
- استيراد الوحدات في بايثون 3: دليل شامل
- استخدام منسقات النصوص في بايثون 3
- البرمجة باستخدام بايثون 3: كيف تبدأ في بناء الفئات وتعريف الكائنات؟
حوسبة سعيدة!
التعليقات
لا توجد تعليقات بعد. كن أول من يعلق.