python中函数定义参数有四种形式:python

def fun1(a,b,c):
pass
def fun2(a=1,b=2,c=3):
pass
def fun3(*args):
pass
def fun4(**kargs):
pass

四种中最多见是前两种,基本上通常点的教程都会涉及,后两种通常不多单独出现,经常使用在混合模式中ide

第一种 fun1(a,b,c)是直接将实参赋予形参,根据位置作匹配,即严格要求实参的数量与行参的数量位置相等,比较通常,大多数语言经常使用这种方式。函数

第二种 fun2(a=1,b=2,c=3)根据键值对的形式作实参与形参的匹配,经过这种式就能够忽略了参数的位置关系,直接根据关键字来进行赋值,同时该种传参方式还有个好处就是能够在调用函数的时候做为个别选填项,不要求数量上的相等,便可以fun5(3,4)来调用fun2函数,这里关键就是前面的3,4覆盖了原来a、b两个形参的值,但c仍是不变采用原来的默认值3,这种模式相较第一种更加灵活,不只能够经过fun6(c=5,a=2,b=7)来打乱行参的位置,并且能够在没有对应形参传递的时候使用定义函数时的默认值。学习

第三种 fun3(*args) ,这定义方式在传参时是能够传入任意个参数,这些若干参数都被放到了tuple元组中赋值给行参args,以后要在函数中使用这些行参,直接操做args这个tuple元组就能够了,这样的好处是在参数的数量上没有了限制,可是由于是tuple,其自己仍是有次序的,这就仍然存在必定的束缚,在对参数操做上也会有一些不便spa

第四种 fun4(**kargs)最为灵活,其是以键值对字典的形式向函数传参,含有第二种位置的灵活的同时具备第三种方式的数量上的无限制。此外第三四种函数声明的方式前的'*',与c里面的指针声明同样,这里仅作声明标识之用指针

最后要强调的是四种定义和传递方式混合使用(大多数状况是这种),fun7(a,b,c,**d),但四种方式混用时要遵照:定义和传递时,*kargs必须在*args以后教程

混合使用时的赋值过程为:get

一、先根据前两种形式定义的函数,按顺序把实参赋值给对应的形参;it

二、将多余出非键值对实参打包组成一个tuple传递给*args;io

三、将多余的key=value形式的实参打包正一个dicrionary传递给**kargs

举例

def test(x,y=5,*a,**b):

print x,y,a,b

#调用结果:

test(1) ===> 1 5 () {}
test(1,2) ===> 1 2 () {}
test(1,2,3) ===> 1 2 (3,) {}
test(1,2,3,4) ===> 1 2 (3,4)
test(x=1) ===> 1 5 () {}
test(x=1,y=1) ===> 1 1 () {}
test(x=1,y=1,a=1) ===> 1 1 () {'a':1}
test(x=1,y=1,a=1,b=1) ===> 1 1 () {'a':1,'b':1}
test(1,y=1) ===> 1 1 () {}
test(1,2,y=1) ===> 出错,说y给赋了多个值
test(1,2,3,4,a=1) ===> 1 2 (3,4) {'a':1}
test(1,2,3,4,k=1,t=2,o=3) ===> 1 2 (3,4) {'k':1,'t':2,'o':3}

以上就是本文的所有内容,但愿对你们的学习有所帮助,也但愿你们多多支持。