位置参数

即遵循位置一一对应的原则

默认参数

python中的默认参数类似于 C++ 的默认参数,值得注意的是 python 默认参数的一个坑

def push_back(L=[]):
    L.append('$')
    return L

该函数的默认参数是一个空列表,然而当执行如下语句时:

>>> push_back()
['$']
>>> push_back()
['$','$']

因此,在使用默认参数的时候,默认参数要指向不可变对象
可以采用如下方式:

def push_back(L=None):
    if L is None:
        L = []
    L.append('$')
    return L

其中 None 常量不是 false,0,也不是空对象,表示没有值,可以参考文末第二篇参考文献

可变参数

可变参数的传入的参数个数是可变的(包括 0),定义函数时,在可变参数名前加一个 *

这里有个疑问,是关于可变参数中的 * 和打包操作中的 * 的区别。

def sum(*args):
    s = 0
    for n in args:
        s = s + n
    return s
L = [1, 2, 3, 4]
s = sum(*L)

可变参数在函数调用时,会被组装为一个 turple

关键字参数

可以传入 0 至任意多个带名字的参数,被组装成字典传入。定义函数时,在参数名前加 ** 指定关键字参数。可以用 ** 来将字典变量以关键字参数的形式传入,这里可以参考 python-打包和解包

如果需要对关键字参数指定名字(命名关键字参数),需要在名字前用 * 或者可变参数间隔

# 关键字参数
def person(**kw):
    if 'city' in kw:
        pass
    if 'age' in kw:
        pass
# 命名关键字参数
# 只接受 age 和 city 作为关键字的参数
def person1(name, *, age, city):
    pass
def person2(name, *friends, age, city):
    pass

当使用上述多种参数时,参数组合的顺序是必选参数、默认参数、可变参数、命名关键字参数、关键字参数

References

  1. 函数的参数
  2. Python None(空值)及用法 (biancheng.net)