在程序开发过程中,我们经常要为参数指定默认值。这样在调用函数时,可以使用比定义时更少的参数,例如:
def ask_ok(prompt, retries=4, reminder='Please try again!'):
while True:
ok = input(prompt)
if ok in ('y', 'ye', 'yes'):
return True
if ok in ('n', 'no', 'nop', 'nope'):
return False
retries = retries - 1
if retries < 0:
raise ValueError('invalid user response')
print(reminder)
该函数可以用以下三种方式调用:
- 只给出必选实参:
ask_ok('Do you really want to quit?')
- 给出一个可选实参:
ask_ok('OK to overwrite the file?', 2)
- 给出所有实参:
ask_ok('OK to overwrite the file?', 2, 'Come on, only yes or no!')
在上面的例子中还使用了关键字 in
,用于确认序列中是否包含某个值。
默认值在 定义 作用域里的函数定义中求值,所以:
i = 5
def f(arg=i):
print(arg)
i = 6
f()
上例输出的是 5
。
重要警告: 默认值只计算一次。默认值为列表、字典或类实例等可变对象时,会产生与该规则不同的结果。例如,下面的函数会累积后续调用时传递的参数:
def f(a, L=[]):
L.append(a)
return L
print(f(1))
print(f(2))
print(f(3))
输出结果如下:
[1]
[1, 2]
[1, 2, 3]
需要提醒的是:
- 即使中间有次函数调用过程中,显式的给 L 传递了值,在此之后的调用如果还是用默认值的方式,依然会持续累积。
- 不想在后续调用之间共享默认值时,应以如下方式编写函数:
def f(a, L=None):
if L is None:
L = []
L.append(a)
return L
网友评论