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)

浙公网安备 33010602011771号