Django 2.0 入门与实践
上QQ阅读APP看书,第一时间看更新

5.3 函数参数

5.3.1 位置参数

位置参数就是在调用的时候必须要按照正确顺序传入的参数,调用时的数量必须与函数声明一致。如加法运算函数中的参数x和y,调用时必须要接收两个参数,这就是位置参数。

5.3.2 默认参数

某些时候函数的参数值很少发生变化,因此为了简化调用方法,我们将这类很少变化的参数设置成默认参数,调用时不传递参数值,此时函数内部使用默认值。

下面是一个使用了默认参数的函数,该函数用来计算整数的n次方,在数学运算中绝大多数情况下只进行平方运算,对于高次方的运算很少,基于此设置函数第二个参数的默认值为2:

    def power(x, n = 2):
        return x ** n

使用下面参数调用power函数:

    >>> power(2)
    >>> power(2, 3)
    >>> power(2, 5)

输出:

    4
    8
    32

由此可见,默认参数可以简化函数的调用。但是设置默认参数时仍需注意以下几点:


□ 默认参数需要放在必选参数之后,如果有多个默认参数,那么所有默认参数都要放在必选参数之后。

□ 只为很少变化的参数设置默认参数。


下面举一个现实中使用默认参数的例子,在小学生入学登记时需要填写学生姓名、性别、年龄、城市信息。分析需求发现,对于一所学校的新生,他们的年龄基本一致都是7岁或8岁入学,而城市基本一致,性别只有男、女两种情况。由此可见,如果将性别、年龄、城市设置为默认参数的话会大大提高学生信息录入效率,据此编写函数,如图5-3所示。

图5-3

输出结果如图5-4所示。

图5-4

5.3.3 关键字参数

Python中有两种类型的关键字参数:


□ 对于函数调用方,可以使用参数名传递参数值的参数;

□ 对于函数定义方,可以定义一个参数,这个参数类似于**kwargs形式,这个参数会接收所有命名参数。


上面关于小学生信息注册的函数就属于第一种关键字参数,我们发现,在调用register函数的时候使用了类似于gender = ‘男'这样的写法,这就是第一种关键字参数。

下面以第二种情况举个例子:

编写函数:

    def foo(*positional, **keywords):
        print("Positional:", positional)
        print("Keywords:", keywords)

调用函数:

    >>> foo('one', 'two', 'three')

输出:

    Positional: ('one', 'two', 'three')
    Keywords: {}

由此可见参数*positional接收了全部位置参数(positional argument)。

下面再看看关键字参数的调用:

    >>> foo(a='one', b='two', c='three')

输出:

    Positional: ()
    Keywords: {'a': 'one', 'b': 'two', 'c': 'three'}

此时虽然传递的参数个数、参数值都没有变,但是为每个参数都传递了名字,输出结果正好相反,第一次*positional接收了参数,第二次**keywords接收了参数。另外还可以看出positional是元组类型,keywords是字典类型。

下面再看一个混合调用的情况:

    >>> foo('one','two',c='three',d='four')

输出:

    Positional: ('one', 'two')
    Keywords: {'c': 'three', 'd': 'four'}

符合我们的推测,*positional接收位置参数, **keywords接收命名参数。