函数的参数
<人力资源/>定义函数的时候,我们把参数的名字和位置确定下来,函数的接口定义就完成了。对于函数的调用者来说,只需要知道如何传递正确的参数,以及函数将返回什么样的值就够了,函数内部的复杂逻辑被封装起来,调用者无需了解。
Python的函数定义非常简单,但灵活度却非常大。除了正常定义的必选参数外,还可以使用默认参数,可变参数和关键字参数,使得函数定义出来的接口,不但能处理复杂的参数,还可以简化调用者的代码。
位置参数
<人力资源/>#先写一个计算x的平方的函数:
<代码> def权力(x): 返回x * n=int(输入(“请输入想要开平方的数值:')) 打印(权力(n)) 代码>
#对于权力(x)函数,参数x就是一个位置函数。
#挡我们调用权力()函数时,必须传入有且仅有一个的参数x
<代码>祝辞的在比;(5) 25 在在在(15) 225年代码>
#现在,如果要计算X的3次方怎么办?可以再定义一个力量3函数,但是如果要计算X的n次方怎么办,我们不可能定义无限多个函数
#你也许想到了,可以把权力(x)修改(x, n)为力量,用来计算x的n次方
<代码> def权力(x, n): s=1 虽然n> 0: n -=1 s=s * x 代码返回s >
#对于这个修改后的权力(x, n)函数,可以计算任意n次方:
,<代码>祝辞的在比;权力(5,2) 25 在在在权力(5,3) 125年代码>
#修改后的权力(x, n)函数有两个参数:x和n,这两个参数都是位置参数,调用函数时,传入的两个值按照位置顺序依次赋给参数x和n。
默认参数
<人力资源/>#新的权力(x, n)函数定义没有问题,但是,旧的调用代码失败了,原因是我们增加了一个参数,导致旧的代码因为缺少一个参数而无法正常调用:
,<代码>祝辞的在比;(5) 回溯(最近的电话): 文件“& lt; stdin>”,1号线& lt; module> TypeError:权力()失踪1所需的位置参数:“n”代码>
# Python的错误信息很明确:调用函数的力量()缺少了一个位置参数n。
#这个时候,默认参数就排上用场了。由于我们经常计算x2,所以,完全可以把第二个参数n的默认值设定为2:
<代码> def权力(x, n=2): s=1 n比;0: n=n - 1 s=s * x 代码返回s >
#这样,当我们调用电源(5)时,相当于调用权力(5,2):
,<代码>祝辞的在比;(5) 25 在在在权力(5,2) 25 代码>
#而对于n比;2的其他情况,就必须明确地传入n,比如权力(5,3)。
#从上面的例子可以看的出,默认参数可以简化函数的调用。设置默认参数时,有几点要注意:
#一是必选参数在前,默认参数在后,否则Python的解释器会报错(思考一下为什么默认参数不能放在必选参数前面),
#二是如何设置默认参数。
#当函数有多个参数时,把变化大的参数放前面,变化小的参数放后面。变化小的参数就可以作为默认参数。
#使用默认参数有什么好处?最大的好处是能降低调用函数的难度。
#举个例子,我们写个一年级小学生注册的函数,需要传入姓名和性别两个参数:
<代码> def登记(姓名,性别): 打印(“名字:”,名称) 打印(性别:,性别)代码>
#这样,调用登记()函数只需要传入两个参数:
,<代码>祝辞的在比;登记(“莎拉”、“F”) 名称:莎拉 性别:F 代码>
#如果要继续传入年龄,城市等信息怎么办?这样会使得调用函数的复杂度大大增加。
#我们可以把年龄和城市设为默认参数:
<代码> def登记(姓名、性别、年龄=6,城市='北京'): 打印(“名字:”,名称) 打印(性别:,性别) 打印(年龄:,年龄) 打印(“城市”,城市)代码>
#这样,大多数学生注册时不需要提供年龄和城市,只提供必须的两个参数:
,<代码>祝辞的在比;登记(“莎拉”、“F”) 名称:莎拉 性别:女 年龄:6 城市:北京代码>
#只有与默认参数不符的学生才需要提供额外的信息:
<代码>登记(“鲍勃”,“M”, 7) 登记(“亚当”,“M”,城市=疤旖颉?代码>