python 函数参数

1.元组,字典做参数 
def func(*kargs,**kwargs):
return kargs,kwargs
def fund(a,b,c=0,*ka,**kw):
return a,b,c,ka,kw
def fune(*kar,**kwr):
return kar,kwr
if __name__=='__main__':
a = (1,2,3)
b = dict(m=1,n=2)

print func(*a,**b) #这种前面加个*,**会自动循环a,b将里面每一个元素迭代的给kargs,kwargs /  func(a,b)  ->kargs里面 只有一个元素(1,2,3)kwargs里面也一样
print func(1,2,3,m=1,n=2) #推荐使用这种
print fund(1,2,3,*a,**b) #推荐使用这种
print fund(1,2,3,4,5,6,x=1,y=2)
print fund(1,2,3,4,5,6)#刚好匹配完
print fund(1,2,3,4,5,{'a':1,'b':2}) #这种方式 全部塞进去了元组
print fune(1,2,3,4,5,**{'a':1,'b':2}) #前面加上两个** 即可匹配

2.函数参数传递的不同点
def func(a): 这种传递的是引用 id 相同
def func(*kargs): 这种新建的对象 id 不同
def func(**kwargs): 这种新建的对象 id 不同

 

3.建议不要将默认参数的名字和动态参数字典里面的key 相同

def fucf(k1=0,k2=0,**kwargs):

  print(k1,kwargs)

fucf(k2=2,k1=1,k3=3) #kwargs 不可能会出现k1,k2这两个的

def fucf(k1=0,k2=0,**kwargs):
    print(k1,k2,kwargs)
dicta ={'k1':1,'k2':2}
fucf(**dicta)  #输出结果是 1,2,{}

 4.参数顺序

如果可变长参数放在前面,则后面的默认参数,除非指定名称,否则无法匹配,只能使用默认值(无默认值,则会保存)。 

如果可变长参数放在后面,则会先匹配默认参数,剩下的属于可变长参数。

def fucf(k1=0,*args,k2=0):
    print(k1,args,k2)
tupla =(1,2,3,4,5)
fucf(*tupla)

结果:1 ( 2, 3, 4, 5) 0

总结:参数顺序

def fucf(k1,*args,k2=0):
    print(k1,args,k2)
tupla =(1,2,3,4,5)
fucf(3,*tupla,k2=6) #3 (1, 2, 3, 4, 5) 6  不使用默认参数

def fucf(k1,*args,k2=0):
    print(k1,args,k2)
tupla =(1,2,3,4,5)
fucf(3,*tupla) # 3 (1, 2, 3, 4, 5) 0  使用默认参数

#混合使用
def fucf(k1,*args,k2=0,**kwargs):
print(k1,args,k2,kwargs)
tupla =(1,2,3,4,5)
fucf(3,*tupla,k2=3,a=1,b=3) # 3 (1, 2, 3, 4, 5) 3 {'b': 3, 'a': 1}
 

 5.理解位置参数,默认参数,可变参数,关键字参数,命名关键字参数

  位置参数:依照顺序,依次传值

  默认参数:可以不传递值,函数直接使用默认参数,func(k1,*args,k2=0,**kwargs)  既可以修改k2的值,又能使用k2=0  代码如上

              函数不使用默认参数,func(k1,k2=0,*args,**kwargs)   只能修改k2的值,不能使用k2=0

  可变参数:允许将多个参数赋值个*args,函数将其打包成一个元组args

  关键字参数:允许将多个含参数名的参数赋值给**kwargs, 函数将其打包成一个字典kwargs

  命名关键字参数:函数参数里面,用*分割,*后面的参数为命名关键字参数,可以有缺省值  如:person(name, age, *, city='beijing', job)  

  

posted @ 2017-04-21 14:16  1916  阅读(122)  评论(0)    收藏  举报