python的函数可以有五种参数:位置参数、默认参数、可变参数、关键字参数和命名关键字参数
1.位置参数
位置参数最简单,函数执行时会按照传入参数的位置进行参数调用,比方在power(5,2)时,函数就明白x=5,n=2,而不是x=2,n=5
def power(x, n): s = 1 while n > 0: n = n - 1 s = s * x return s
2.默认参数
默认参数是在位置参数的基础上,增强的功能,对于大部分已经固定或者默认已知的参数,可以在函数定义的时候写在函数参数中,真正调用时可以不写,当然如果写的话,新参数值就会替换默认参数值
备注:默认参数一定要写在必选参数之后。默认参数一定要指向不可变对象
def power(x, n=2): s = 1 while n > 0: n = n - 1 s = s * x return s
3.可变参数
真正的生产环节,函数的参数五花八门,最常见的情况就是函数的参数个数是不确定的。这个时候可变参数就派上用场了。
函数定义的时候在参数前加一个*号,这样即便传入不同个数的参数,函数也能处理。calc(1,2,3) ,calc(1,2,3,5)都能返回正常的值。
def calc(*numbers): sum = 0 for n in numbers: sum = sum + n * n return sum
如果要传入一个list,或者一个tuple,也没有必要写成calc(list[0],list[1]...)这样复杂的结构,python贴心的提供了calc(*list)这种模式,赞一个!
4.关键字参数
关键字参数,顾名思义是以dict的形式传入的参数,函数定义的时候以**kw表示,用户再调用函数时可以不传,默认就是{}
如果说可变参数是开发者在定义函数的时候考虑到参数的个数不确定而进行的扩展性开发,那么关键字参数就是对可能传入的参数的个数和类型都不确定的情况下的增强扩展。
def person(name, age, **kw): print('name:', name, 'age:', age, 'other:', kw)
更复杂的情况下,关键字参数实在太多,调用函数太复杂,我们可以把数据装入一个字典dict,这样person(bob,25,**dict)调用即可
5.命名关键字参数
对于关键字参数,函数的调用者可以传入任意不受限制的关键字参数。如果要限制关键字参数的名字,就可以用命名关键字参数。
例如,只接收city
和job
作为关键字参数。这种方式定义的函数如下:
def person(name, age, *, city, job): print(name, age, city, job)
和关键字参数**kw
不同,命名关键字参数需要一个特殊分隔符*
,*
后面的参数被视为命名关键字参数。调用方式如下:
>>> person('Jack', 24, city='Beijing', job='Engineer') Jack 24 Beijing Engineer
如果函数定义中已经有了一个可变参数,后面跟着的命名关键字参数就不再需要一个特殊分隔符*
了:
def person(name, age, *args, city, job): print(name, age, args, city, job)
命名关键字参数必须传入参数名,这和位置参数不同。如果没有传入参数名,调用将报错。
6.参数组合
在Python中定义函数,可以用必选参数、默认参数、可变参数、关键字参数和命名关键字参数,这5种参数都可以组合使用。但是请注意,参数定义的顺序必须是:必选参数、默认参数、可变参数、命名关键字参数和关键字参数。
本文参考了廖雪峰老师的python教程,特此声明,非常感谢!