در پایتون، لیستها (آرایهها)، تاپلها و دیکشنریها را میتوان گسترش داد (باز کردن بستهبندی) و عناصر مربوطه آنها را میتوان با هم به عنوان آرگومان تابع ارسال کرد.
هنگام فراخوانی یک تابع، آرگومان را با * برای لیست ها و تاپل ها و ** برای دیکشنری ها مشخص کنید. به تعداد ستاره * توجه کنید.
جزئیات زیر در اینجا توضیح داده شده است.
- بزرگ کردن (باز کردن بسته بندی) یک لیست یا چندتایی با * (یک ستاره)
- برای توابع با آرگومان های پیش فرض
- برای توابع با آرگومان های با طول متغیر
- فرهنگ لغت را با ** (دو ستاره) گسترش دهید (باز کردن بسته بندی)
- برای توابع با آرگومان های پیش فرض
- برای توابع با آرگومان های با طول متغیر
برای استفاده اساسی از توابع پایتون، آرگومان های پیش فرض و آرگومان های طول متغیر با *،** هنگام تعریف توابع، مقاله زیر را ببینید.
- مربوط:نحوه استفاده و یادداشت آرگومان های پیش فرض در توابع پایتون
- مربوط:نحوه استفاده از آرگومان های طول متغیر در پایتون(
*args
،**kwargs
)
بزرگ کردن (باز کردن بسته بندی) یک لیست یا چندتایی با * (یک ستاره)
هنگامی که یک لیست یا تاپل به عنوان آرگومان با * مشخص می شود، گسترش می یابد و هر عنصر به عنوان یک آرگومان جداگانه ارسال می شود.
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'}