一、概念
python中*args和**kwargs为魔法变量。args是arguments的缩写,表示位置参数;kwargs是keyword arguments的缩写,表示关键字参数。args和kwargs为编程人员约定的名字,可替换成其它字符串,只有前面的*才是必须的。当两个变量一起使用时,位置参数要放在关键字参数前面。
*args表示任何多个无名参数,可为0个,本质上是一个tuple。
**kwagrs表示任何多个键值对参数,可为0个,本质上是一个dict。
即*args是传递不定数量的tuple位置参数,**kwargs是传递不定数量的dict关键字参数。
def func(*args,**kwargs):
print(args)
print(type(args))
print(kwargs)
print(type(kwargs))
func(1,2,"hello","word",hello=1,word=2)
'''
(1, 2, 'hello', 'word')
<class 'tuple'>
{'hello': 1, 'word': 2}
<class 'dict'>
'''
二、应用
1、*args的用法
打包函数
将传递给函数的不定数量的参数打包成一个元组。
def func(x,y,*args):
print("已知参数:x=%s,y=%s"%(x,y))
print("不定长参数为:",args)
for i in args:
print("不定长参数:",i)
func(1,2,3,4,"hello word!")
'''
已知参数:x=1,y=2
不定长参数为: (3, 4, 'hello word!')
不定长参数: 3
不定长参数: 4
不定长参数: hello word!
'''
位置参数不在形参后面,需要在参数传入时,明确定义 *args后面的位置参数,否则会报错。
def func(x,*args,y):
print("x=",x,"y=",y,"args=",args)
func(1,2,3,4,y=5) #x= 1 y= 5 args= (2, 3, 4)
拆分参数
可以将一个列表或元组传递给一个函数,并使用*args来解包它们。这样,列表或元组中的元素将作为独立的参数传递给函数。
a=[1,2,3,4,5]
b=('a','b','c','d','e')
def func(x,y,*z):
print("xy:",x,y)
print("z:",z)
func(*a)
func(*b)
'''
xy: 1 2
z: (3, 4, 5)
xy: a b
z: ('c', 'd', 'e')
'''
2、**kwargs的用法
打包参数
将传递给函数的任意多个(也可以是零个)关键字参数打包成一个字典。
def func(x,y,**kwargs):
print("xy=",x,y)
print("kwargs=",kwargs)
func(1,2,hello=1,word=2)
'''
xy= 1 2
kwargs= {'hello': 1, 'word': 2}
'''
拆分参数
将传递给函数的字典拆分成独立的多个元素然后赋值给函数中的参数变量。
在拆分字典时,使用*拆分出来传给函数的只有键值(key),使用**拆分出来的是字典的每一项。
a={"hello":1,"word":2,"!":3}
def func(x,y,z):
print("x y z:",x,y,z)
func(*a) #x y z: hello word !
def func(**kwargs):
print("kwargs:",kwargs)
func(**a) #kwargs: {'hello': 1, 'word': 2, '!': 3}
3、默认参数、位置参数和关键字参数的用法
函数的传递参数有多种是,参数顺序为:位置参数、默认参数、*args和**kwargs。
def func(a,b=1,*args,**kwargs):
print(a,b,args,kwargs)
func(1) #1 1 () {}
func(1,2) #1 2 () {}
func(1,2,3,4) #1 2 (3, 4) {}
func(1,2,3,4,k='5',m='6') #1 2 (3, 4) {'k': '5', 'm': '6'}
4、限制参数类型
定义函数时,参数中可以使用 /和 *来限制参数类型。
调用函数时,/前面只能是位置参数,*后面只能是关键字参数,不限制/和*之间的参数类型。
def func(x,/,y,z,*,k):
print(x,y,z,k)
func(1,2,z=3,k=4) #1 2 3 4