转自https://www.cnblogs.com/ellisonzhang/p/10243122.html
一、函数的动态参数 *args,**kwargs, 形参的顺序
1、你的函数,为了拓展,对于传入的实参数量应该是不固定,
所以就需要用到万能参数,动态参数,*args, **kwargs
1,*args 将所有实参的位置参数聚合到一个元组,并将这个元组赋值给args
(起作用的是* 并不是args,但是约定俗成动态接收实参的所有位置参数就用args)
def sum1(*args): print(args) sum1(1,2,['hello']) #是一个元组(1, 2, ['hello'])
2,**kwargs 将所有实参的关键字参数聚合到一个字典,并将这个字典赋值给kwargs
(起作用的是** 并不是kwargs,但是约定俗成动态接收实参的所有关键字参数就用kwargs)
def fun(*args,**kwargs): print(args) print(kwargs) fun(1,2,['a','b'],name='xiaobai',age=18) # 结果: # (1, 2, ['a', 'b']) #位置参数,元组 # {'name': 'xiaobai', 'age': 18} #关键字参数,字典
2、*的用法
在函数的定义时,*位置参数,**关键字参数--->聚合。
在函数的调用(执行)时,*位置参数,**关键字参数--->打散。
实参--->*位置参数--->把位置参数打散成最小的元素,然后一个个添加到args里组成一个元组
l1 = [1,2,3] l2 = [111,22,33,'xiaobai'] #如果要将l1,l2通过函数整合到一起 # 方法一(实参不用*): def func1(*args): return args[0] + args[1] print(func1(l1,l2)) #[1, 2, 3, 111, 22, 33, 'xiaobai'] # 方法二(实参用*): def func1(*args): return args print(func1(*l1,*l2)) #(1, 2, 3, 111, 22, 33, 'xiaobai')
实参--->**关键字参数--->把关键字参数打散成最小的元素,然后一个个添加到kwargs里组成一个字典
def func1(**kwargs): print(kwargs) #func1(name='xiaobai',age=18,job=None,hobby='girl') func1(**{'name':'xiaobai','age':18},**{'job':None,'hobby':'girl'}) # 结果: # {'name': 'xiaobai', 'age': 18, 'job': None, 'hobby': 'girl'}
3、形参的顺序(a--->b,代表的顺序是写参数时,要先写a再写b)
位置参数--->默认参数
def func(a,b,sex='男'): print(sex) func(100,200)
位置参数--->*args--->默认参数
def func(a,b,*args,sex='男'): print(a,b) print(args) print(sex) func(100,200,1,2,34,5,'女',6) # 结果: # 100 200 #a,b # (1, 2, 34, 5,'女',6) #args # 男 #默认参数
位置参数--->*args--->默认参数--->**kwargs
def func(a,b,*args,sex='男',**kwargs): print(a,b) print(args) print(sex) print(kwargs) func(100,200,1,2,34,5,6,sex='女',name='xiaobai',age=1000) func(100,200,1,2,34,5,6,name='xiaobai',age=1000,sex='女') # 两个的结果都是: # 100 200 #a,b # (1, 2, 34, 5, 6) #args # 女 #默认参数修改后的值 # {'name': 'xiaobai', 'age': 1000} #kwargs # 若是形参这样写: def func(a,b,*args,**kwargs,sex='男'): print(a,b) print(args) print(sex) print(kwargs) func(100,200,1,2,34,5,6,name='xiaobai',age=1000,sex='女') # 结果:会报错,默认参数一定要写在kwargs前面