默认参数:
默认参数必须放在必选参数后;
一般来讲,经常变化的参数放在前面,不经常变化的放在后面;
多个默认参数时,入参按顺序赋值,也可以用指定参数名的方式赋值。
默认参数必须指向不可变对象!因为函数定义时,默认参数就定义了,如果参数指向对象可变,调用函数时改变了对象,则下次调用函数时,默认参数的值就不是定义时的值了。
可变参数:
def func(*numbers):
pass
该函数可以有任意个参数。在函数内部,numbers接收到一个tuple。
Python允许在list和tuple变量前加一个*号,将list和tuple的元素变成可变参数传入。这样比先取出元素在传入函数来的方便。
nums = [1,2,3]
func(*nums)
关键字参数:
关键字参数允许用户传入任意个含参数名的参数,在函数内部这些参数组成一个dict。
def person(name,age,**kw):
print(“name:”,name, “age:”, age, “other:”, kw)
与可变参数一样,Python允许在dict前加**,将dict的元素传入关键字参数。
extra= {‘city’:’beijing’, ‘job’:’doctor’}
person(‘jack’,25, **extra)
在函数内部,kw获得的是extra的一个拷贝,内部修改dict不会影响函数外的dict。
命名关键字参数:
命名关键字参数用于限制关键字参数的名字。例如只接受city和job关键字参数,
def person(name, age, *, city, job):
pass
命名关键字参数需要*作为特殊分隔符(不是参数),后面为关键字参数名字。
调用时必须传入参数名。命名关键字参数可以有默认值。
参数组合
除了可变参数和命名关键字参数无法混合,其他可以相互组合使用。但顺序必须是:必须参数、默认参数、可变参数/命名关键字参数、关键字参数。
def f1(a, b, c=0, *args, **kw):
pass
def f2(a, b, c=0, *, d, **kw):
pass
而且,通过tuple和dict也可以调用以上函数,
args= [1,2,3,4]
kw={‘d’:99,‘x’:’#’}
f1(*args,**kw)
args= [1,2,3]
kw= {‘d’:99, ‘x’:’#’}
f2(*args,**kw)
对于任意函数,都可以通过func(*args, **kw)的方式调用,不论其参数如何定义。
可变参数和关键字参数习惯上使用*args和**kw。