Ang mga sumusunod na argumento ng pag-andar ay marahil ang pinaka-karaniwan na nakatutulig sa iyo kapag tiningnan mo ang code ng Python at sasabihin, “Ano ito?
*args
**kwargs
Anumang bilang ng mga argumento (mga variable-length na argumento) ay maaaring tukuyin sa pamamagitan ng pagdaragdag ng asterisk sa argument sa kahulugan ng function bilang mga sumusunod
*
**
Ang mga pangalang *args,**kwargs ay kadalasang ginagamit bilang isang kombensiyon. Gayunpaman, ang ibang mga pangalan ay katanggap-tanggap hangga’t ang * at ** ay nasa simula. Ang sumusunod na sample code ay gumagamit ng mga pangalang *args,**kwargs.
Ang mga sumusunod na detalye ay inilarawan sa ibaba.
*args
:Tumatanggap ng maraming argumento bilang isang tuple**kwargs
:Tumatanggap ng maraming argumento ng keyword bilang isang diksyunaryo
*args:Tumatanggap ng maraming argumento bilang isang tuple
Maaaring tukuyin ang di-makatwirang bilang ng mga argumento sa pamamagitan ng pagtukoy sa mga argumento na may *, tulad ng sa *args.
def my_sum(*args):
return sum(args)
print(my_sum(1, 2, 3, 4))
# 10
print(my_sum(1, 2, 3, 4, 5, 6, 7, 8))
# 36
Maramihang mga argumento ang natatanggap bilang isang tuple sa function. Sa halimbawa, ang sum() function ay ipinasa sa isang tuple upang kalkulahin ang kabuuan.
def my_sum2(*args):
print('args: ', args)
print('type: ', type(args))
print('sum : ', sum(args))
my_sum2(1, 2, 3, 4)
# args: (1, 2, 3, 4)
# type: <class 'tuple'>
# sum : 10
Maaari rin itong isama sa argumento ng posisyon.
Ang value na tinukoy pagkatapos (sa kanan ng) positional argument ay ipinasa sa args bilang isang tuple. Kung mayroon lamang isang positional argument, ito ay isang walang laman na tuple.
def func_args(arg1, arg2, *args):
print('arg1: ', arg1)
print('arg2: ', arg2)
print('args: ', args)
func_args(0, 1, 2, 3, 4)
# arg1: 0
# arg2: 1
# args: (2, 3, 4)
func_args(0, 1)
# arg1: 0
# arg2: 1
# args: ()
Maaaring tukuyin muna ang mga argumentong may markang *. Sa kasong ito, gayunpaman, ang mga argumentong tinukoy sa huli kaysa sa *args ay dapat na tukuyin sa anyo ng keyword. Hindi sinasadya, ang format ng keyword ay ang form na “pangalan ng argumento = halaga”.
Ang huling halaga ay hindi awtomatikong ipinapasa sa positional argument. Samakatuwid, kung hindi ito tinukoy bilang argumento ng keyword, magreresulta ang isang TypeError error.
def func_args2(arg1, *args, arg2):
print('arg1: ', arg1)
print('arg2: ', arg2)
print('args: ', args)
# func_args2(0, 1, 2, 3, 4)
# TypeError: func_args2() missing 1 required keyword-only argument: 'arg2'
func_args2(0, 1, 2, 3, arg2=4)
# arg1: 0
# arg2: 4
# args: (1, 2, 3)
Kung ang * argumento lang ang tinukoy, ang mga kasunod na argumento ay dapat palaging tukuyin bilang mga argumento ng keyword.(keyword-only argument
)
def func_args_kw_only(arg1, *, arg2):
print('arg1: ', arg1)
print('arg2: ', arg2)
# func_args_kw_only(100, 200)
# TypeError: func_args_kw_only() takes 1 positional argument but 2 were given
func_args_kw_only(100, arg2=200)
# arg1: 100
# arg2: 200
**kwargs:Tumatanggap ng maraming argumento ng keyword bilang isang diksyunaryo
Maaaring tukuyin ang di-makatwirang bilang ng mga argumento ng keyword sa pamamagitan ng pagtukoy ng mga argumento na may ,** tulad ng sa **kwargs.
Sa function, ang pangalan ng argument ay natanggap bilang isang diksyunaryo na ang susi ay ang susi at ang halaga ay ang halaga.
def func_kwargs(**kwargs):
print('kwargs: ', kwargs)
print('type: ', type(kwargs))
func_kwargs(key1=1, key2=2, key3=3)
# kwargs: {'key1': 1, 'key2': 2, 'key3': 3}
# type: <class 'dict'>
Maaari rin itong gamitin kasabay ng argumento ng posisyon.
def func_kwargs_positional(arg1, arg2, **kwargs):
print('arg1: ', arg1)
print('arg2: ', arg2)
print('kwargs: ', kwargs)
func_kwargs_positional(0, 1, key1=1)
# arg1: 0
# arg2: 1
# kwargs: {'key1': 1}
Sa pamamagitan ng pagtukoy sa object ng diksyunaryo na may ** bilang argumento kapag tumatawag sa function, posible itong palawakin at ipasa ito bilang kaukulang argumento.
d = {'key1': 1, 'key2': 2, 'arg1': 100, 'arg2': 200}
func_kwargs_positional(**d)
# arg1: 100
# arg2: 200
# kwargs: {'key1': 1, 'key2': 2}
Ang mga argumentong may markang ** ay maaari lamang tukuyin sa dulo ng argumento. Ang pagtukoy ng isa pang argumento pagkatapos ng argumentong minarkahan ng ** ay magreresulta sa isang SyntaxError error.
# def func_kwargs_error(**kwargs, arg):
# print(kwargs)
# SyntaxError: invalid syntax