最有用的形式是對一個或多個參數指定一個默認值。這樣創建的函數,可以用比定義時允許的更少的參數調用,比如:
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。
重要警告: 默認值只會執行一次。這條規則在默認值為可變對象(python列表、字典以及大多數類實例)時很重要。比如,下面的函數會存儲在后續調用中傳遞給它的參數:
def f(a, L=[]): L.append(a) return L print(f(1)) print(f(2)) print(f(3))
這將打印出
[1] [1, 2] [1, 2, 3]
如果你不想要在后續調用之間共享默認值,你可以這樣寫這個python函數:
def f(a, L=None): if L is None: L = [] L.append(a) return L
