*args,只有1个*时表示元组
一般指使用元组传入参数,在函数体中直接以元组变量的方式使用该参数
def a(*args):
print(args, type(args))
a(1, 24, 5)
# (1, 24, 5) <class 'tuple'>
为什么不使用列表,而是用元组?
元组是是不可变,不能修改的,以防止在函数体对传入的参数意外修改。
**kwargs,2个*是表示字典
指使用字典传入参数,可以直接以字典变量的方式
def a(**args):
print(args, type(args))
a(a=1, b=24, c=5)
# {'a': 1, 'b': 24, 'c': 5} <class 'dict'>
*args和**kwargs一起使用
def a(*args, **kwargs):
print(args, type(args))
print(kwargs, type(kwargs))
a(1, 34, 5, a=1, b=24, c=5)
#(1, 34, 5) <class 'tuple'>
#{'a': 1, 'b': 24, 'c': 5} <class 'dict'>
装包和拆包
在函数动态参数使用*args和**kwargs中,实际上将传入的参数打包成一个元组,字典的形式,在函数中直接调用args调用时
调用的时一个元组,kwargs则是字典,要将原来输入还原出来应该加入*和**
def a(*args, **kwargs):
# 此处的args表示装包,即将1,34,5装包成一个元组
print(args, type(args)) # (1, 34, 5) <class 'tuple'>
# 拆包,在args前加入*
print(*args) # 1 34 5
# 一个*时表示获取键值key
print(*kwargs) # a b c
# 注意直接将字典拆开时时无法打印的,此时借助一个函数打印
# 此时相当直接使用b(a=1,b=24,c=5)进行赋值,如果函数b中不是a,b,c会报错
b(**kwargs)
def b(a, b, c):
print(a)
print(b)
print(c)
a(1, 34, 5, a=1, b=24, c=5)