python中*args和**kwargs的理解_Python中的*args和**kwargs用法

用法

Python的参数有位置参数和关键字参数之分.位置参数之间有顺序之分.在函数定义或者函数调用时,各种参数之间的顺序是有要求的: 1.Formal positional arguments;2.*args;3.Keyword arguments;4.**kwargs

区分

本质

特点

函数定义

函数调用

*args

tuple元组

不定长[主要针对函数定义],内部元素有序

作为形参,需要在函数体中对args元素进行逐个解析; 当调用*args为形参的函数时,传递参数可以不定长[若干位置参数被打包成一个tuple(个人理解)]

函数在定义时,已经定义了若干形参,通过*args来进行调用时,会对args进行解包,内部元素会按照顺序依次给函数的形参进行赋值

**kwargs

dict字典

不定长[主要针对函数定义],内部元素无序

作为形参,需要在函数体内对kwargs元素进行逐个解析,不过可以通过key获取相应的value值; 当调用**kwargs为形参的函数时,传递的关键字参数可以不定长[若干关键字参数被打包成一个dict字典,然后传递(个人理解)]

函数定义时,已经定义了若干关键字参数;通过**kwargs进行调用时,会先对kwargs字典进行解包,通过函数形参对kwargs字典进行查找并取值

函数定义

*args

def multiply(*args):

z = 1

for num in args:

z *= num

print(z)

# 可以看到参数不定长

multiply(4, 5) # 20

multiply(10, 9) # 90

multiply(2, 3, 4) # 24

multiply(3, 5, 10, 6) # 900

**kwargs

def print_kwargs(**kwargs):

print(kwargs)

print_kwargs(kwargs_1="Shark", kwargs_2=4.5, kwargs_3=True)

# {'kwargs_3': True, 'kwargs_2': 4.5, 'kwargs_1': 'Shark'} # 可以看出理解应该没问题,被打包成一个dict,然后传递

函数调用

函数调用时, 被传递的参数无论是*args或者**kwargs,在函数执行时,传递的参数需要解包,然后把解包元素依次赋值给函数定义时的相应形参(在函数定义时,形式参数可能是确定的,也就是说是定长的). 如果再用不定长进行调用,容易出错[例外的是,关键字参数,如果相应关键字参数有默认值,那么不定长还生效]

注意,如果kwargs以一个星号*解析,那么只会解包出kwargs的key.

*args

def some_args(arg_1, arg_2, arg_3):

print("arg_1:", arg_1)

print("arg_2:", arg_2)

print("arg_3:", arg_3)

args = ("Sammy", "Casey", "Alex")

some_args(*args)

# arg_1: Sammy

# arg_2: Casey

# arg_3: Alex

args1 = ("Sammy", "Alex")

some_args(*args1)

# TypeError: some_args() missing 1 required positional argument: 'arg3'

# 换一种调用方式,补全了参数个数

some_args("Casey", *args1)

# 运行正常

# arg_1: Casey

# arg_2: Sammy

# arg_3: Alex

**kwargs

kwargs关键字的key必须和函数定义时,形式参数的名称一模一样, 否则调用时会报错,TypeError.

kwargs字典被解包[],然后根据函数定义时,形式参数的名称,在kwargs字典中查找,

没找到,报错 TypeError: some_function() got an unexpected keyword argument 'arg3'

找到了,设置为相应的值,运行函数体

def some_kwargs(kwarg_1, kwarg_2, kwarg_3):

print("kwarg_1:", kwarg_1)

print("kwarg_2:", kwarg_2)

print("kwarg_3:", kwarg_3)

kwargs = {"kwarg_1": "Val", "kwarg_2": "Harper", "kwarg_3": "Remy"}

some_kwargs(**kwargs)

# kwarg_1: Val

# kwarg_2: Harper

# kwarg_3: Remy

# 字典key和函数定义时的形式参数名称不一致

kwargs1 = {"kwarg_1": "Val", "kwarg_2": "Harper", "kwarg_4": "Remy"}

some_kwargs(**kwargs1)

# TypeError: some_args() got an unexpected keyword argument 'kwarg_4'

# 字典的参数内容少了

kwargs1 = {"kwarg_1": "Val", "kwarg_2": "Harper"}

some_kwargs(**kwargs2)

#TypeError: some_args() missing 1 required positional argument: 'kwarg_3'

References

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值