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接收命名参数。