Python的函数定义中除了正常定义的必选参数外,还可以使用默认参数、可变参数和关键字参数
1、必选参数:须以正确的顺序传入函数。调用时的数量必须和声明时的一样。调用函数是必须传入一个参数,否则会报错
def printme(str):#str就是一个比传参数 print(str) printme('6666666') #printme() #若不传参数,将会报错printme() missing 1 required positional argument: 'str'
2、默认参数:调用函数时,默认参数的值如果没有传入,则被认为是默认值
def printinfo(name,age=18): print('%s是%s岁'%(name,age)) printinfo(name='abc')#age不传的时候,就使用默认值,传了使用新传的值
3、关键字参数:关键字参数和函数调用关系紧密,函数调用使用关键字参数来确定传入的参数值。使用关键字参数允许函数调用时参数的顺序与声明时不一致,因为 Python 解释器能够用参数名匹配参数值。
关键字参数允许你传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict。函数printinfo除了必选参数name
和age
外,还接受关键字参数kw
。在调用该函数时,可以只传入必选参数
def printinfo(name,age=18,**kw):#kw就是关键字函数,两个** print('%s是%s岁,其他信息%s'%(name,age,kw)) printinfo(age=25,name='猴子',city='beijin') #输出:猴子是25岁,其他信息{'city': 'beijin'}
4、可变参数:需要一个函数能处理比当初声明时更多的参数。这些参数叫做可变参数。可变参数就是传入的参数个数是可变的,可以是1个、2个到任意个,还可以是0个
def calc(*numbers): #numbers就是一个可变参数,一个* sum = 0 for n in numbers: sum = sum + n * n return sum print(calc(2,3,4))
定义可变参数和定义list或tuple参数相比,仅仅在参数前面加了一个*
号。在函数内部,参数numbers
接收到的是一个tuple,因此,函数代码完全不变。但是,调用该函数时,可以传入任意个参数,包括0个参数。如果已经有一个list或者tuple,要调用一个可变参数怎么办?可以这样做:
def calc(*numbers): sum = 0 for n in numbers: sum = sum + n * n return sum list1 =[2,4,6,8] print(calc(list1[0],list1[1],list1[2],list1[3])) #当然,这样看起来很复杂,可以试试下面这种 print(calc(*list1))#和上面一样,只是简便写法
5、参数组合
在Python中定义函数,可以用必选参数、默认参数、可变参数和关键字参数,这4种参数都可以一起使用,或者只用其中某些,但是请注意,参数定义的顺序必须是:必选参数、默认参数、可变参数和关键字参数。在函数调用的时候,Python解释器自动按照参数位置和参数名把对应的参数传进去。
def func(a,b,c=0,*args,**kwargs):#依次为必传参数,默认值参数,可变参数,关键字参数 print('a =', a, 'b =', b, 'c =', c, 'args =', args, 'kw =', kwargs) func(1,2,3) func(1,2,3,'a','b') func(1,2,3,'a','b',x=99)
输出为:
a = 1 b = 2 c = 3 args = () kw = {} a = 1 b = 2 c = 3 args = ('a', 'b') kw = {} a = 1 b = 2 c = 3 args = ('a', 'b') kw = {'x': 99}
#有意思的用法 args = (1, 2, 3, 4) kw = {'x': 99} func(*args, **kw)#可变参数传一个元组,不可变参数仍为字典 #输出跟上面最后一个一样