python函數的定義比起別的語言要簡單的多,但是卻更加靈活,其中函數的參數可以分爲幾下幾類:
- 位置參數
- 默認參數
- 可變參數
- 關鍵字參數
- 命名關鍵字參數
位置參數
下面是一個 計算x的任意n次方 函數
def power(x,n):
s = 1
while n > 0:
n = n -1
s = s * x
return s
>>> power(5, 2)
25
>>> power(5, 3)
125
可以看出power(x, n)
函數有兩個參數:x 和 n ,都是位置參數,調用函數時,傳入的兩個值需要按位置順序依次賦值給參數 x 和 n,如果少一個參數或者順序不對都會出錯。
默認參數
依舊是一個 計算x的任意n次方 函數
def power(x,n = 2):
s = 1
while n > 0:
n = n -1
s = s * x
return s
>>> power(5)
25
>>> power(5, 3)
125
可以看到,這次函數只需要調用一個參數就可以執行,n會設定爲默認值。但對於n > 2 的情況,就必須明確地傳入n,比如power(5,3)
。
默認參數可以簡化函數的調用,設置默認參數時,要注意一下幾點:
- 必須參數在前,默認參數在後,否則python解釋器會報錯
- 如何設置默認參數 :
當函數有多個參數時,把變化大的參數放前面,變化小的參數放後面。變化小的參數就可以作爲默認參數。使用默認參數最大的好處是能降低調用函數的難度。 - 有多個默認參數時,調用的時候,既可以按順序提供默認參數,也可以不按順序提供部分默認參數。
當不按順序提供部分默認參數時,需要把參數名寫上。比如調用 XXX(‘arg1’, ‘arg2’, ‘arg3’=’xxx’),意思是,arg3參數用傳進去的值,其他默認參數繼續使用默認值。
定義默認參數要牢記一點:默認參數必須指向不變對象!
可變參數
你可能需要一個函數能處理比當初聲明時更多的參數。這些參數叫做不定長可變參數,聲明時不會命名。
加了星號(*)的變量名會存放所有未命名的變量參數。
# 可變參數說明
def printinfo( arg1, *vartuple ):
"打印任何傳入的參數"
print arg1
for var in vartuple:
print var
return;
# 調用printinfo 函數
printinfo( 10 ); // 10
printinfo( 70, 60, 50 ); // 70 60 50
關鍵字參數
可變參數允許你傳入0個或任意個參數,這些可變參數在函數調用時自動組裝爲一個tuple。
關鍵字參數允許你傳入0個或任意個含參數名的參數,這些關鍵字參數在函數內部自動組裝爲一個dict。
請看示例:
def person(name, age, **kw):
print('name:', name, 'age:', age, 'other:', kw)
# 調用該函數時,可以只傳入必選參數:
>>> person('Michael', 30)
name: Michael age: 30 other: {}
# 也可以傳入任意個數的關鍵字參數:
>>> person('Bob', 35, city='Beijing')
name: Bob age: 35 other: {'city': 'Beijing'}
>>> person('Adam', 45, gender='M', job='Engineer')
name: Adam age: 45 other: {'gender': 'M', 'job': 'Engineer'}
關鍵字參數有什麼用?它可以擴展函數的功能。比如,在person函數裏,我們保證能接收到name和age這兩個參數,但是,如果調用者願意提供更多的參數,我們也能收到。試想你正在做一個用戶註冊的功能,除了用戶名和年齡是必填項外,其他都是可選項,利用關鍵字參數來定義這個函數就能滿足註冊的需求。
命名關鍵字參數
如果要限制關鍵字參數的名字,就可以用命名關鍵字參數,例如,只接收city和job作爲關鍵字參數。這種方式定義的函數如下:
def person(name, age, *, city, job):
print(name, age, city, job)
# 調用方式如下
>>> person('Jack', 24, city='Beijing', job='Engineer')
Jack 24 Beijing Engineer
和關鍵字參數**kw
不同,命名關鍵字參數需要一個特殊分隔符,後面的參數被視爲命名關鍵字參數。
如果函數定義中已經有了一個可變參數,後面跟着的命名關鍵字參數就不再需要一個特殊分隔符*了:
def person(name, age, *args, city, job):
print(name, age, args, city, job)
本文參照廖雪峯老師python教程,參考原文請點擊此處