4.7.1. 参数默认值

最有用的形式是对一个或多个参数指定一个默认值。这样创建的函数,可以用比定义时允许的更少的参数调用,比如:

  1. def ask_ok(prompt, retries=4, reminder='Please try again!'):
  2. while True:
  3. ok = input(prompt)
  4. if ok in ('y', 'ye', 'yes'):
  5. return True
  6. if ok in ('n', 'no', 'nop', 'nope'):
  7. return False
  8. retries = retries - 1
  9. if retries < 0:
  10. raise ValueError('invalid user response')
  11. 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 关键字。它可以测试一个序列是否包含某个值。

默认值是在 定义过程 中在函数定义处计算的,所以

  1. i = 5
  2.  
  3. def f(arg=i):
  4. print(arg)
  5.  
  6. i = 6
  7. f()

会打印 5

重要警告: 默认值只会执行一次。这条规则在默认值为可变对象(列表、字典以及大多数类实例)时很重要。比如,下面的函数会存储在后续调用中传递给它的参数:

  1. def f(a, L=[]):
  2. L.append(a)
  3. return L
  4.  
  5. print(f(1))
  6. print(f(2))
  7. print(f(3))

这将打印出

  1. [1]
  2. [1, 2]
  3. [1, 2, 3]

如果你不想要在后续调用之间共享默认值,你可以这样写这个函数:

  1. def f(a, L=None):
  2. if L is None:
  3. L = []
  4. L.append(a)
  5. return L