Python中*arg和**kwargs的用法
在Python中的函数定义与调用中经常会见到args和kwargs,而且前面通常还会加上一个或两个星号。其实这只是编程人员约定的变量名字,换成其他变量名也是可以的。args是arguments的缩写,表示位置参数;kwargs是keyword arguments的缩写,表示关键字参数。这其实就是Python中可变参数的两种形式,并且*args必须放在**kwargs的前面,因为位置参数在关键字参数的前面。
1. 解包与压包
将元组、列表、字典、字符串、生成器等整体中的每个元素当成个体剥离出来,这个过程就是解包,反过来即为压包。
1.用于函数定义时
args和**kwargs用于函数定义时,均为可变参数,表示将不定数量的参数传递给一个参数,即事先不知道函数的调用者会传递多少个参数。arg表示任意多个无名参数,类型为tuple;kwargs表示关键字参数,为dict。
在Python中,当*和符号出现在函数定义的参数中时,用于动态传参,是一个压包的过程。
代码示例:
def test_kwargs(first, *args, **kwargs):
print('Required argument: ', first)
print(args)
print(type(kwargs))
print(kwargs)
for v in args:
print('Optional argument (args): ', v)
for k, v in kwargs.items():
print('Optional argument %s (kwargs): %s' %(k, v))
test_kwargs(1, 2, 3, 4, k1=5, k2=6)
output:
Required argument: 1
(2, 3, 4)
<class 'dict'>
{'k1': 5, 'k2': 6}
Optional argument (args): 2
Optional argument (args): 3
Optional argument (args): 4
Optional argument k1 (kwargs): 5
Optional argument k2 (kwargs): 6
2.用于函数调用时
在调用函数时,*和**都会起到解包传参的作用。
- *会以单个元素的形式解包序列(如元组、列表、集合),使其成为独立的参数。
- **会以键值对的形式解包字典,使其成为独立的关键字参数。
代码示例:
def test_args_kwargs(arg1, arg2, arg3):
print("arg1: ", arg1)
print('arg2: ', arg2)
print('arg3: ', arg3)
args = ("two", 3, 5)
test_args_kwargs(*args)
output:
arg1: two
arg2: 3
arg3: 5
kwargs = {"arg3": 3, "arg2": "two", "arg1": 5}
test_args_kwargs(**kwargs)
output:
arg1: 5
arg2: two
arg3: 3
浙公网安备 33010602011771号