python学习笔记8-函数的多类型传值和冗余参数


函数多类型传值

例一,元组传参(灵活多变)

In [2]: def fun(x,y):
   ...:     return x+y
In [4]: print fun(3,5)
8
In [5]: t=(1,2)
In [6]: print fun(*t)  #注意,这里使用的是*t调用元组t
3
In [7]: print fun(t)   #用t,不加*,报错只给了一个参数,需要给2个参数
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-7-e28f492cc4ca> in <module>()
----> 1 print fun(t)
TypeError: fun() takes exactly 2 arguments (1 given)

In [10]: def fun(x,y,z):
   ....:     return x+y+z
   ....: 

In [11]: t1=(2,3,4)

In [12]: fun(*t1)       #把元组t1的值,2,3,4分别赋值给x,y,z
Out[12]: 9

In [13]: fun(*(1,2,3))  #把1,2,3赋值给x,y,z
Out[13]: 6

In [14]: fun(1,*t)      #t=(1,2) 把1,1,2分别赋值给x,y,z
Out[14]: 4


In [15]: fun(*t,1)      
  File "<ipython-input-15-aee1a8f57f2b>", line 1
    fun(*t,1)
SyntaxError: only named arguments may follow *expression
只有命名参数后面可以跟*expression表达式,1是命名参数,(1,*t)正确,(*t,1)错误

也可以这样调用参数
In [16]: fun(x=1,y=3,z=5)
Out[16]: 9

例二、字典传值(灵活多变)

注:字典的key和形参是一样的才行,都是x,y,z,否则报错
In [10]: def fun(x,y,z):
   ....:     return x+y+z
   n [20]: dic ={'x':1,'y':3,'z':5}
In [21]: fun(**dic)          #**dic这种传值方法ok
Out[21]: 9

In [88]: dic1={'y':9,'z':90}   #注意:这里必须是x,y,z,需要和fun()对应,不能是a,b,c

In [89]: fun(1,**dic1)        #  1,**dic1 这种传值方法也ok
100

In [92]: fun(**{'x':5,'y':6,'z':90})  # **{'x':5,'y':6,'z':90}这种传值方法也ok
101


函数的冗余参数


向函数传元组和字典

处理多余实参,传到字典中

def fun(x,y,*args,**kwargs)

In [98]: def fun(x,y,*args,**kwargs):
    ...:     print x
    ...:     print y
    ...:     print args
    ...:     print kwargs
    ...:     
    ...:     

In [99]: t=(1,2)

In [100]: dic1={'a':4,'c':9,'b':80}

In [117]: fun(1,2,3,4,[1,2],*t,f=2,**dic1)
1 #对应命名参数x
2 #对应命名参数y
(3, 4, [1, 2], 1, 2)   #多余参数3,4都存到元祖里面和*t即t=(1,2)作为冗余参数存在元祖里面
{'a': 4, 'c': 9, 'b': 80, 'f': 2} #f=2,**dic1,以等号和字典的key和value的形式冗余参数会保存到字典里