1.默認參數。定義默認參數要牢記一點:默認參數必須指向不變對象!
爲何要設計str、None這樣的不變對象呢?由於不變對象一旦建立,對象內部的數據就不能修改,這樣就減小了因爲修改數據致使的錯誤。此外,因爲對象不變,多任務環境下同時讀取對象不須要加鎖,同時讀一點問題都沒有。咱們在編寫程序時,若是能夠設計一個不變對象,那就儘可能設計成不變對象。app
def add_end(L=None): if L is None: L = [] L.append('END') return L
2.可變參數(參數前面加*)函數
def calc(*numbers): sum = 0 for n in numbers: sum = sum + n * n return sum print(calc(1, 2, 3))
3.關鍵字參數(**kw)
可變參數容許你傳入0個或任意個參數,這些可變參數在函數調用時自動組裝爲一個tuple。而關鍵字參數容許你傳入0個或任意個含參數名的參數,這些關鍵字參數在函數內部自動組裝爲一個dict。設計
def person(name, age, **kw): print('name:', name, 'age:', age, 'other:', kw) person('Jack', 18) person('Mike', 30, city='Beijing', job='Engineer')
4.命名關鍵字參數(*後面的參數被視爲命名關鍵字參數)
若是要限制關鍵字參數的名字,就能夠用命名關鍵字參數,例如,只接收city和job做爲關鍵字參數。code
def person(name, age, *, city='Beijing', job): print(name, age, city, job) # 若是函數定義中已經有了一個可變參數,後面跟着的命名關鍵字參數就再也不須要一個特殊分隔符* def person2(name, age, *args, city, job): print(name, age, args, city, job) # 命名關鍵字參數必須傳入參數名。因爲命名關鍵字參數city具備默認值,調用時,可不傳入city參數 person('Jack', 18, job='Engineer')