#*arg相当于不定个数的参数元组,有时可以放在参数表的最后,把多出来的参数都归到这里。
#**kwargs相当于把多余的参数以字典的形式收集起来。
#def foo(x,*args,**kwargs):
print(x);print(args);print(kwarg);
#foo(1,2,3,4,y=1,a=2,b=3,c=4)
#结果为1 (2,3,4) {‘y’:1,‘a’:2,‘b’:3,‘c’:4}
#x叫位置参数,x与*arg与**kwarg的顺序必须是这样的,不能变。
#理解:args相当于在参数表中按照位置传值的参数;kwarg相当于按照关键字传值的参数,且kwarg中的key必须与需要的形参名对应,不多也不少且对应。
######################################################################################################################
#编程技巧:函数的参数可以为多个有时为少个时,可以把增加的参数作为有默认值的参数放入参数列表。变化大的参数放在前面,
#变化小的参数放后面。变化小的参数就可以作为默认参数。默认参数的好处是降低函数调用的难度。
#并且,无论是简单调用还是复杂调用,函数只有一个。
#注意:有默认值的参数不应该设置为数列这样可变的对象,否则多次调用,因为这个值是随着调用一直在变的,会出错。应该用str,None这样的不变值作为参数。
#如果参数可变个数,可以传入列表或元组,但是输入值要写成列表或元组的形式,太麻烦。写成arg简洁,甚至可以表示0个参数。
#在实参前加星号也有用,可以把List或tuple变成参数列表。 **kwarg把字典改成关键字参数,kwarg为字典,实现关键字和字典的转换。
#四种参数的顺序: func(a, b, c=0, *args, **kw)这是必须的。
#对于任意函数,都可以通过类似func(*args, **kw)的形式调用它,无论它的参数是如何定义的。