#形参*args:收集参数
# 功能1:收集除位置参数外的所有参数,以元组形式返回;
# 功能2:实参以'*'和'可迭代类型'一起的形式,如*[],*(),*{},*"...",传入时,
# *args,星号'*'的作用,用来解析'可迭代类型'中元素,放入元组,实质是循环取得'可迭代类型'中每个元素,存入元组
#注意,*{'a':1,'b':2},为字典时,得到的是key值,如a,b;**{'a':1,'b':2},获得键值对,如a=1,b=2
def test1(x,y,*args,**kwargs):# x,y,位置参数,*args,收集参数,收集除位置参数外的所有参数,以元组形式返回
print('x=',x)
print('args=',args)
print('len=',len(args))
print('kwargs=',kwargs)
print('kw_len=',len(kwargs))
test1(2,1,[3,4,5],(7,8),9,10,*'abcd',*['ag',123,'b'],*('c','d'),*{11,22,33},*{'key1':'v1'},m=12,**{'k':'v','k1':'v1'})
#运行结果:
# x= 2
# args= ([3, 4, 5], (7, 8), 9, 10, 'a', 'b', 'c', 'd', 'ag', 123, 'b', 'c', 'd', 33, 11, 22, 'key1')
# len= 17
# kwargs= {'m': 12, 'k': 'v', 'k1': 'v1'}
# kw_len= 3
***********************************************************************************************************************
#形参**kwargs:仅收集映射,如:关键字参数(x=3,y=5),实质也是键值对形式;**字典参数(**{})
#以字典形式返回
def test2(m,n,**kwargs):
print('m=',m)
print('kwargs=',kwargs)
print('len=',len(kwargs))
test2(1,2,x=3,y=5,**{'k':'v','k2':5})
# 运行结果:
# m= 1
# kwargs= {'x': 3, 'y': 5, 'k': 'v', 'k2': 5}
# len= 4
def f(x,y,z,f=5,*args,**kwargs):#位置,关键字,默认,可变参数(包裹参数),键值对可变参数
print ('x=%s,y=%s,z=%s,f=%s,args=%s,kwargs=%s'%(x,y,z,f,args,kwargs))
f(1,2,[1,2],4,5,['a','b'],*[4,5],j=9,n=10,**{'k':8,'m':3})
#返回:x=1,y=2,z=[1, 2],f=4,args=(5, ['a', 'b'], 4, 5),kwargs={'j': 9, 'n': 10, 'k': 8, 'm': 3}
#注:*[],**{},星号,是用来用包裹,获取包裹在里面的数,
#注:关键字参数,如z=8,和**kwargs,键值对包裹参数,不能同时使用
#注:默认参数,只编译一次,如fn(var,list=[]),编译时,生成一个list=[]对象,如果不传递默认参数,每次都引用这个共同的list=[]的对象
def fn(var,list=[]):
list.append(var)
print(list)
a=fn('10')
b=fn('k') #['10','k']