def power(x, n): return x ** n
站在形參的角度:
x 和 n 都是位置參數
站在實參的角度:
x 和 n 有兩種傳參的方法
(1)嚴格按照順序進行傳參
(2)按照默認參數的形式進行傳參python
>>> power(2, n = 4) 16 或 >>> power(n=4, x=2) 16
在平常使用中,咱們發現計算最多的都是 x 的平方,可是咱們每次調用都須要傳遞兩個參數,在這樣的狀況下,咱們能夠將 n 默認設置爲 2,這就是默認參數。函數
>>> power(4) 16 或者 >>> power(4, n=2) 16
而對於 n > 2 的其餘狀況,就必須明確的傳入 n 好比:power(4, n=4)spa
>>> power(4, n=4) 256
從上面的例子能夠看出,默認參數能夠簡化函數的調用。設置默認參數時,有幾點須要注意:
(1)必選參數(位置參數)在前,默認參數在後,不然Python的解釋器會報錯;
(2)把變化大的參數放前面,變化小的參數放後面。變化小的參數就能夠做爲默認參數。對象
使用默認參數能夠下降調用函數的難度,可是定義默認參數要牢記一點:默認參數必須指向不變對象! blog
在python函數中,還能夠定義可變參數。可變參數就是傳入的參數個數是可變的,能夠是1個、2個到任意個,還能夠是0個。ci
定義可變參數:it
def calc(*args): n = 0 for i in args: n += i return n >>> calc(1,2,3,4,5,6) # 能夠傳入的參數個數是可變的 21 >>> calc(1,2,3) 6
也能夠直接傳入一個 list 或者 tuple,傳入方式以下:class
>>> li = [1,2,3,4] >>> calc(*li) 10 >>> t1 = (1,2,3,4,5,6) >>> calc(*t1) 21
可變參數容許傳入0個或任意個參數,這些可變參數在函數調用時自動組裝爲一個 tuple。而關鍵字參數容許傳入0個或任意個含參數名的參數,這些關鍵字參數在函數內部自動組裝爲一個 dict 。語法
>>> def person(name, age, **kwargs): # 關鍵參數定義爲: **kwargs ... print('name:', name, 'age:', age, 'other:', kwargs) ... >>> person('jay', 20, city='taibei', sex='male') # 關鍵字參數容許傳入0個或任意個含參數名的參數 name: jay age: 20 other: {'sex': 'male', 'city': 'taibei'} # 函數調用時自動組裝爲一個 dict
對於關鍵字參數,函數的調用者能夠傳入任意不受限制的關鍵字參數。至於到底傳入什麼,就須要在函數內部經過kwargs檢查,若是要限制關鍵字參數的名字,就可使用命名關鍵字參數,例如 person函數只接收 city 和 job 做爲關鍵字參數。定義以下:程序
和關鍵字參數**kwargs不一樣,命名關鍵字參數須要一個特殊分隔符*,*後面的參數被視爲命名關鍵字參數。
>>> def person(name, age, *, city, job): ... print(name, age, city, job) ... >>> person('jay', 20, city='taibei', job='singer') jay 20 taibei singer
在python中定義函數,能夠用位置參數、默認參數、可變參數、關鍵字參數和命名關鍵字參數,這5種參數均可以組合使用。可是請注意,參數定義的順序必須是: 位置參數、默認參數、可變參數、命名關鍵字參數、關鍵字參數
好比定義一個函數,包含若干參數:
>>> def f1(a, b, c=3, *args, **kwargs): ... print('a=', a, 'b=', b, 'c=', c, 'arg=', args, 'kwargs=', kwargs) ... >>> f1('a', 'b', 'c', 'd', 'e', 'f', h='H', i='I' ,j='J') a= a b= b c= c arg= ('d', 'e', 'f') kwargs= {'i': 'I', 'j': 'J', 'h': 'H'}
默認參數必定要用不可變對象,若是是可變對象,程序運行時會有邏輯錯誤!要注意定義可變參數和關鍵字參數的語法: *args是可變參數,args接收的是一個tuple; **kw是關鍵字參數,kw接收的是一個dict。 以及調用函數時如何傳入可變參數和關鍵字參數的語法:可變參數既能夠直接傳入:func(1, 2, 3),又能夠先組裝list或tuple,再經過*args傳入:func(*(1, 2, 3));關鍵字參數既能夠直接傳入:func(a=1, b=2),又能夠先組裝dict,再經過**kw傳入:func(**{'a': 1, 'b': 2})。