1 ret = func(**{'a':1,'b':2,'c':3})2 print(ret)3
4 #---->6
func(**{'a':1,'b':2,'c':3}
函数的参数
定义函数的时候,我们把参数的名字和位置确定下来,函数的接口定义就完成了。对于函数的调用者来说,只需要知道如何传递正确的参数,以及函数将返回什么样的值就够了,函数内部的复杂逻辑被封装起来,调用者无需了解。
Python的函数定义非常简单,但灵活度却非常大。除了正常定义的必选参数外,还可以使用默认参数、可变参数和关键字参数,使得函数定义出来的接口,不但能处理复杂的参数,还可以简化调用者的代码。
参数的分类
函数大致可以分为两类,形式参数和实际参数。简单的说定义函数时定义的参数就是实际参数,调用函数时传递的参数就是实际参数。
站在函数定义的角度函数可以分为:必位置参数,默认参数、动态参数(*args,**kwargs)。下面我们来看一下如何第一这些参数。
参数的定义
位置参数:
这是最常见的定义方式,一个函数可以定义任意个参数,每个参数间用逗号分割,用这种方式定义的函数在调用的的时候也必须在函数名后的小括号里提供个数相等
的值(实际参数),而且顺序必须相同,也就是说在这种调用方式中,形参和实参的个数必须一致,而且必须一一对应,也就是说第一个形参对应这第一个实参。例如:
deffunc(x,y):return x + y
调用该函数func(5,6)。这里5传递给x,6传递给y。如果这样调用就会报错func(5),func(5,6,7)
1 ret = func(5, 6)2 print(ret)3
4 #-->11
func(5,6)
1 ret = func(5)2 print(ret)3
4 #-->
5 #TypeError: func() missing 1 required positional argument: 'y'
func(5)
1 ret = func(5, 6, 7)2 print(ret)3
4 #-->
5 #TypeError: func() takes 2 positional arguments but 3 were given
func(5,6,7)
默认参数:
默认参数是在函数定义是借给函数赋了一个默认的值。如果再调用时不给函数传递实参那么调用时就是用这个默认值,如果调用时给函数传递了实参,那么就是用传递的这个实参。例如:
def func(x,y=6):return x + y
调用该函数时我们可以这样调用func(5),也可以这样调用func(10,8),还可以这样调用func(10,y=8)
1 ret = func(5)2 print(ret)3
4 #-->11
func(5)
1 ret = func(10, 8)2 print(ret)3
4 #-->18
func(10, 8)
1 ret = func(10, y=8)2 print(ret)3
4 #-->18
func(10,y=8)
动态参数:
*args(参数名可修改,但是*不能修改)
上面两种方式是有多少个形参,就传进去多少个实参,但有时候会不确定有多少个参数,则此时第三种方式就比较有用,它以一个*加上形参名的方式来表示这个函
数的实参个数不定,可能为0个也可能为n个。注意一点是,不管有多少个,在函数内部都被存放在以形参名为标识符的元组中。
下面我们来定义一个就收任意个实参,并将实参相加的函数。
1 def func(*args):2 s =03 for i inargs:4 s +=i5 return s
调用该函数时我们可以传递任意个实参。
1 ret = func(5, 5, 5)2 print(ret)3
4 #---->15
func(5, 5, 5)
1 ret = func(5, 5, 6, 6)2 print(ret)3
4 #---->22
func(5,5,6,6)
**kwargs:(参数名可修改,但是**不能修改)
形参名前加两个*表示,参数在函数内部将被存放在以形参名为标识符的字典中,这时调用函数的方法则需要采用arg1=value
1,arg2=value2这样的形式。
1 def func(**kwargs):2
3 s =04 for v inkwargs.values():5 s +=v6 return s
调用该函数时我们可以这样传递参数func(a=1,b=2,c=3)甚至可以这样func(**{'a':1,'b':2,'c':3})
1 ret = func(**{'a':1,'b':2,'c':3})2 print(ret)3
4 #---->6
func(**{'a':1,'b':2,'c':3}
1 ret = func(a=1,b=2,c=3)2 print(ret)3
4 #---->6
View Code