args和*kwargs

首先,*args**kwargs 的命名是可以任意的,也可以随便叫\*vars 或者 \*kws

*args

就是可变参数罢了,它以一个数组的形式对外呈现。

定义函数的时候,如果不想指定参数的数量,就可以用\*args来替代。

def print_numbers(*args):
    for i in args:
        print(i)


print_numbers(1, 2, 3, 4)

类似Java中的可变参数

public void print_numbers(int... numbers){
    ......
}

但是可变参数的类型需要保持一致,否则根本不知道调用者传什么类型的参数,容易出错。

另外需要注意的是,*args后面的参数,需要指定变量传参,否则会报错,如下面这个例子

def print_numbers(*args, a, b, c):
    pass

# 如果写print_numbers(1,2,3,4,5,6)则执行的时候报错提示a,b,c未传值
print_numbers(1,2,3,a=4, b=5, c=6)

**kwargs

就是一个键值对的对象,它以字典的形式对外呈现,即{"key":"value", "key2":"value2"...}

def print_numbers(**kwargs):
    for key, value in kwargs.items():
        print(f"{key}:{value}")


print_numbers(name="sonny", age=18)

在这个例子中,调用的时候,name="sonny"就是以字典的形式传入kwargs中。

需要注意的是: **kwargs后面不能跟其他参数,也就是说,**kwargs要放最后面