ما هي * args و ** kwargs في بيثون؟

وظائف هي الحياة. حقا؟ إذا كنت بدأت للتو في تعلم Python ، فلا يهم إذا كانت هي لغة البرمجة الأولى ، أو إذا أتيت إلى Python من لغة أخرى ، فأنت تعلم بالفعل أن عدد المعلمات في إعلان الوظيفة يتوافق مع عدد الوسائط التي تمر بها الوظيفة عند استدعائها.



هذه هي الأساسيات. هذا هو ما يساعد الناس على فهم العالم من حولهم. لكن العبارة "عدد المعلمات تساوي عدد الحجج" تضع قنبلة موقوتة في رأس المبتدئين ، والتي **kwargs بعد أن يرى **kwargs *args غامضة أو **kwargs في إعلان الوظيفة.

لا تدع أي شارات تدفعك إلى ذهول. لا يوجد شيء قديم هنا. بشكل عام ، إذا كانت هذه التصميمات غير مألوفة بالنسبة لك ، أقترح عليك التعامل معها.

الحجج الموضعية والمسمى


من أجل التعامل مع *args و **kwargs ، نحتاج إلى إتقان مفاهيم الوسائط **kwargs المسماة.

أولاً ، دعنا نتحدث عن كيفية اختلافها. في أبسط وظيفة ، نقوم ببساطة بتعيين مواضع الحجج والمعلمات. تتوافق الوسيطة رقم 1 مع المعلمة رقم 1 والحجة رقم 2 للمعلمة رقم 2 وما إلى ذلك.

 def printThese(a,b,c):   print(a, "is stored in a")   print(b, "is stored in b")   print(c, "is stored in c") printThese(1,2,3) """ 1 is stored in a 2 is stored in b 3 is stored in c """ 

لاستدعاء دالة ، كل الوسائط الثلاث مطلوبة. إذا تخطيت واحدة على الأقل ، فسيتم عرض رسالة خطأ.

 def printThese(a,b,c):   print(a, "is stored in a")   print(b, "is stored in b")   print(c, "is stored in c") printThese(1,2) """ TypeError: printThese() missing 1 required positional argument: 'c' """ 

إذا قمت بتعيين قيمة افتراضية للمعلمة عند الإعلان عن وظيفة ، فلم يعد من الضروري الإشارة إلى الوسيطة المقابلة عند استدعاء الوظيفة. تصبح المعلمة اختيارية.

 def printThese(a,b,c=None):   print(a, "is stored in a")   print(b, "is stored in b")   print(c, "is stored in c") printThese(1,2) """ 1 is stored in a 2 is stored in b None is stored in c """ 

يمكن أيضًا تعيين معلمات اختيارية عند استدعاء دالة باستخدام أسمائها.

في المثال التالي ، سنقوم بتعيين المعلمات الثلاثة على القيمة الافتراضية بلا ، ونلقي نظرة على كيفية تعيينها باستخدام أسمائها وعدم الاهتمام بترتيب الوسائط المستخدمة عند استدعاء الوظيفة.

 def printThese(a=None,b=None,c=None):   print(a, "is stored in a")   print(b, "is stored in b")   print(c, "is stored in c") printThese(c=3, a=1) """ 1 is stored in a None is stored in b 3 is stored in c """ 

مشغل النجمة


غالبًا ما يرتبط المشغل * بعملية الضرب في الأشخاص ، ولكن في Python له معنى آخر.

يتيح لك هذا المشغل "فك" الكائنات التي يتم تخزين عناصر معينة داخلها. هنا مثال:

 a = [1,2,3] b = [*a,4,5,6] print(b) # [1,2,3,4,5,6] 

هنا ، a أخذ محتويات القائمة ( a وتفكيكها ووضعها في القائمة ( b .

كيفية استخدام * args و ** kwargs


لذلك ، نحن نعرف أن مشغل "العلامة النجمية" في Python قادر على "سحب" العناصر المكونة لها من الكائنات. نعلم أيضًا أن هناك نوعان من وظائف المعلمات. من الممكن أن تكون قد فكرت في هذا الأمر بنفسك ، لكن في حالة حدوث ذلك ، سأقول هذا. وهي ، *args هي اختصار لـ "وسيطات" (وسيطات) ، و ** kwargs هي اختصار لـ "وسيطات الكلمة الرئيسية" (الوسائط المسماة).

يتم استخدام كل من هذه التركيبات لتفريغ الوسائط من النوع المقابل ، مما يتيح لك استدعاء وظائف مع قائمة الوسائط ذات الطول المتغير. على سبيل المثال - قم بإنشاء دالة يمكنها عرض النتائج التي كتبها طالب في الاختبار:

 def printScores(student, *scores):   print(f"Student Name: {student}")   for score in scores:      print(score) printScores("Jonathan",100, 95, 88, 92, 99) """ Student Name: Jonathan 100 95 88 92 99 """ 

لم أستخدم بناء *args عند الإعلان عن وظيفة. بدلا من ذلك ، لدي *scores . هل يوجد خطأ هنا؟ لا يوجد خطأ هنا. والحقيقة هي أن "الحجج" هي مجرد مجموعة من الشخصيات التي تستخدم للدلالة على الحجج. الشيء الأكثر أهمية هنا هو المشغل * . وما يأتي بالضبط بعد ذلك لا يلعب دورًا خاصًا. باستخدام * أنشأنا قائمة بالوسائط الموضعية استنادًا إلى ما تم نقله إلى الدالة عند استدعائه.

بعد أن اكتشفنا *args ، يجب ألا تكون هناك مشاكل أخرى في فهم **kwargs . الاسم ، مرة أخرى ، لا يهم. الشيء الرئيسي هو حرفين ** . بفضلهم ، يتم إنشاء قاموس يحتوي على الوسائط المسماة التي تم تمريرها إلى الوظيفة عند استدعائها.

 def printPetNames(owner, **pets):   print(f"Owner Name: {owner}")   for pet,name in pets.items():      print(f"{pet}: {name}") printPetNames("Jonathan", dog="Brock", fish=["Larry", "Curly", "Moe"], turtle="Shelldon") """ Owner Name: Jonathan dog: Brock fish: ['Larry', 'Curly', 'Moe'] turtle: Shelldon """ 

النتائج


فيما يلي بعض النصائح لمساعدتك في تجنب المشكلات الشائعة التي تنشأ عند العمل مع الوظائف وتوسيع نطاق معرفتك:

  • استخدم **kwargs *args الشائعة و **kwargs لالتقاط الوسائط الموضعية والمسمى.
  • **kwarg لا يمكن وضع **kwarg s قبل *args . إذا قمت بذلك ، فسيتم عرض رسالة خطأ.
  • احذر من التعارضات بين المعلمات المسماة و **kwargs ، في الحالات التي يتم فيها التخطيط لتمرير القيمة كـ الوسيطة **kwarg ، لكن اسم المفتاح لهذه القيمة يطابق اسم المعلمة المسماة.
  • يمكن استخدام عامل التشغيل * ليس فقط في إعلانات الوظائف ، ولكن أيضًا عند استدعاؤها.

أعزائي القراء! ما المعلمات التي تستخدمها غالبًا عند الإعلان عن وظائف بايثون؟

Source: https://habr.com/ru/post/ar482464/


All Articles