Python notes(6)-自定义函数-函数的参数

Python的函数灵活度非常大。除了正常定义的必选参数外,还可以使用默认参数、可变参数和关键字参数,使得函数定义出来的接口,不但能处理复杂的参数,还可以简化调用者的代码。

默认参数:

在定义时赋值,若调用函数时未给出该参数则默认使用定义时的值

注意:必选参数在前,默认参数在后。

默认参数应该是一个不可变量,否则会出现使用多次调用时默认参数不撤栈造成的BUG 默认函数是自定义函数的时候定义在PyFunctionObject的一个元组里的,每次需要用到默认参数的时候就把他那个引用复制到调用栈的对应参数位置

可变参数:

可变参数允许传入0个或任意个参数,这些可变参数在函数调用时自动组装为一个tuple 对于需要大量输入同类型参数的函数可以用可变参数来解决,用法为在定义的参数前加上*

def calc(*numbers):
    sum = 0
    for n in numbers:
        sum = sum + n * n
    return sum
>>> calc(1, 2, 3)
14
>>> calc(1, 3, 5, 7)
84

如果函数定义中用了可变参数后又想用已有的list或者tuple输入可以在其变量名前再加一个*

关键字参数:

关键字参数允许使用者传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict

定义关键字参数,参数名前加**

def person(name, age, **kw):
    print('name:', name, 'age:', age, 'other:', kw)
>>> person('Michael', 30)
name: Michael age: 30 other: {}

也可以传入任意个数的关键字参数:

>>> person('Bob', 35, city='Beijing')
name: Bob age: 35 other: {'city': 'Beijing'}
>>> person('Adam', 45, gender='M', job='Engineer')
name: Adam age: 45 other: {'gender': 'M', 'job': 'Engineer'}

关键字参数可用于用户注册时非必要信息的录入

关键字参数也可以用已经组装好的dict直接输入

(此时输入的dict是原dict的一份copy,在函数中对传入的dict的改动不会影响原dict)

命名关键字参数:

由于关键字输入的随意性,可能会导致不安全。

可以使用命名关键字参数来只接受固定的关键字参数。

命名关键字参数需要一个特殊分隔符后面的参数被视为命名关键字参数

def person(name, age, *, city, job):
    print(name, age, city, job)

调用方式为:

>>> person('Jack', 24, city='Beijing', job='Engineer')
Jack 24 Beijing Engineer

对于任意函数,都可以通过类似func(*args, **kw)的形式调用它,无论它的参数是如何定义的。(很迷,不太理解)

*args是可变参数,args接收的是一个tuple;

**kw是关键字参数,kw接收的是一个dict。