توسيع وتمرير القوائم والجداول والقواميس كوسائط وظيفية في بايثون

اعمال

في Python ، يمكن توسيع القوائم (المصفوفات) و tuples والقواميس (unpacked) ويمكن تمرير عناصرها معًا كوسائط دالة.

عند استدعاء دالة ، حدد الوسيطة باستخدام * للقوائم والمجموعات و ** للقواميس. لاحظ عدد العلامات النجمية *.

التفاصيل التالية موصوفة هنا.

  • قم بتوسيع (فك) قائمة أو tuple مع * (علامة نجمة واحدة)
    • للوظائف ذات الوسائط الافتراضية
    • للوظائف ذات الوسيطات ذات الطول المتغير
  • قم بتوسيع القاموس (فك حزمه) باستخدام ** (علامتان نجميتان)
    • للوظائف ذات الوسائط الافتراضية
    • للوظائف ذات الوسيطات ذات الطول المتغير

راجع المقالة التالية للتعرف على الاستخدام الأساسي لوظائف Python والوسيطات الافتراضية والوسيطات ذات الطول المتغير مع * ، ** عند تعريف الوظائف.

قم بتوسيع (فك) قائمة أو tuple مع * (علامة نجمة واحدة)

عندما يتم تحديد قائمة أو مجموعة كوسيطة مع * ، يتم توسيعها وتمرير كل عنصر كوسيطة منفصلة.

def func(arg1, arg2, arg3):
    print('arg1 =', arg1)
    print('arg2 =', arg2)
    print('arg3 =', arg3)

l = ['one', 'two', 'three']

func(*l)
# arg1 = one
# arg2 = two
# arg3 = three

func(*['one', 'two', 'three'])
# arg1 = one
# arg2 = two
# arg3 = three

t = ('one', 'two', 'three')

func(*t)
# arg1 = one
# arg2 = two
# arg3 = three

func(*('one', 'two', 'three'))
# arg1 = one
# arg2 = two
# arg3 = three

الشرح التالي خاص بالقائمة ، لكن الأمر نفسه ينطبق على المجموعة.

إذا كان عدد العناصر لا يتطابق مع عدد الوسائط ، يحدث خطأ TypeError.

# func(*['one', 'two'])
# TypeError: func() missing 1 required positional argument: 'arg3'

# func(*['one', 'two', 'three', 'four'])
# TypeError: func() takes 3 positional arguments but 4 were given

للوظائف ذات الوسائط الافتراضية

إذا تم تعيين وسيطة افتراضية ، فسيتم استخدام الوسيطة الافتراضية إذا كان عدد العناصر غير كافٍ. إذا كان عدد العناصر كبيرًا جدًا ، فسيحدث خطأ TypeError.

def func_default(arg1=1, arg2=2, arg3=3):
    print('arg1 =', arg1)
    print('arg2 =', arg2)
    print('arg3 =', arg3)

func_default(*['one', 'two'])
# arg1 = one
# arg2 = two
# arg3 = 3

func_default(*['one'])
# arg1 = one
# arg2 = 2
# arg3 = 3

# func_default(*['one', 'two', 'three', 'four'])
# TypeError: func_default() takes from 0 to 3 positional arguments but 4 were given

للوظائف ذات الوسيطات ذات الطول المتغير

إذا تم تعيين وسيطة ذات طول متغير ، فسيتم تمرير جميع العناصر بعد عنصر الوسيطة الموضعية إلى وسيطة متغيرة الطول.

def func_args(arg1, *args):
    print('arg1 =', arg1)
    print('args =', args)

func_args(*['one', 'two'])
# arg1 = one
# args = ('two',)

func_args(*['one', 'two', 'three'])
# arg1 = one
# args = ('two', 'three')

func_args(*['one', 'two', 'three', 'four'])
# arg1 = one
# args = ('two', 'three', 'four')

قم بتوسيع القاموس (فك حزمه) باستخدام ** (علامتان نجميتان)

عندما يتم تحديد قاموس ديكت كوسيطة مع ** ، يتم توسيع مفاتيح العناصر كأسماء وسيطات وقيم كقيم وسيطة ، ويتم تمرير كل منها كوسيطة منفصلة.

def func(arg1, arg2, arg3):
    print('arg1 =', arg1)
    print('arg2 =', arg2)
    print('arg3 =', arg3)

d = {'arg1': 'one', 'arg2': 'two', 'arg3': 'three'}

func(**d)
# arg1 = one
# arg2 = two
# arg3 = three

func(**{'arg1': 'one', 'arg2': 'two', 'arg3': 'three'})
# arg1 = one
# arg2 = two
# arg3 = three

إذا لم يكن هناك مفتاح يطابق اسم الوسيطة أو كان هناك مفتاح غير مطابق ، سينتج خطأ TypeError.

# func(**{'arg1': 'one', 'arg2': 'two'})
# TypeError: func() missing 1 required positional argument: 'arg3'

# func(**{'arg1': 'one', 'arg2': 'two', 'arg3': 'three', 'arg4': 'four'})
# TypeError: func() got an unexpected keyword argument 'arg4'

للوظائف ذات الوسائط الافتراضية

صورة يتم فيها تحديث قيم أسماء الوسائط التي تطابق المفاتيح الموجودة في القاموس فقط.

سيؤدي المفتاح الذي لا يتطابق مع اسم الوسيطة إلى حدوث خطأ TypeError.

def func_default(arg1=1, arg2=2, arg3=3):
    print('arg1 =', arg1)
    print('arg2 =', arg2)
    print('arg3 =', arg3)

func_default(**{'arg1': 'one'})
# arg1 = one
# arg2 = 2
# arg3 = 3

func_default(**{'arg2': 'two', 'arg3': 'three'})
# arg1 = 1
# arg2 = two
# arg3 = three

# func_default(**{'arg1': 'one', 'arg4': 'four'})
# TypeError: func_default() got an unexpected keyword argument 'arg4'

للوظائف ذات الوسيطات ذات الطول المتغير

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

def func_kwargs(arg1, **kwargs):
    print('arg1 =', arg1)
    print('kwargs =', kwargs)

func_kwargs(**{'arg1': 'one', 'arg2': 'two', 'arg3': 'three'})
# arg1 = one
# kwargs = {'arg2': 'two', 'arg3': 'three'}

func_kwargs(**{'arg1': 'one', 'arg2': 'two', 'arg3': 'three', 'arg4': 'four'})
# arg1 = one
# kwargs = {'arg2': 'two', 'arg3': 'three', 'arg4': 'four'}

func_kwargs(**{'arg1': 'one', 'arg3': 'three'})
# arg1 = one
# kwargs = {'arg3': 'three'}