گسترش و ارسال لیست ها، تاپل ها و دیکشنری ها به عنوان آرگومان های تابع در پایتون

کسب و کار

در پایتون، لیست‌ها (آرایه‌ها)، تاپل‌ها و دیکشنری‌ها را می‌توان گسترش داد (باز کردن بسته‌بندی) و عناصر مربوطه آن‌ها را می‌توان با هم به عنوان آرگومان تابع ارسال کرد.

هنگام فراخوانی یک تابع، آرگومان را با * برای لیست ها و تاپل ها و ** برای دیکشنری ها مشخص کنید. به تعداد ستاره * توجه کنید.

جزئیات زیر در اینجا توضیح داده شده است.

  • بزرگ کردن (باز کردن بسته بندی) یک لیست یا چندتایی با * (یک ستاره)
    • برای توابع با آرگومان های پیش فرض
    • برای توابع با آرگومان های با طول متغیر
  • فرهنگ لغت را با ** (دو ستاره) گسترش دهید (باز کردن بسته بندی)
    • برای توابع با آرگومان های پیش فرض
    • برای توابع با آرگومان های با طول متغیر

برای استفاده اساسی از توابع پایتون، آرگومان های پیش فرض و آرگومان های طول متغیر با *،** هنگام تعریف توابع، مقاله زیر را ببینید.

بزرگ کردن (باز کردن بسته بندی) یک لیست یا چندتایی با * (یک ستاره)

هنگامی که یک لیست یا تاپل به عنوان آرگومان با * مشخص می شود، گسترش می یابد و هر عنصر به عنوان یک آرگومان جداگانه ارسال می شود.

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'}