1、位置參數
def power(x, n):
s = 1
while n > 0:
n = n - 1
s = s * x
return s
power(x, n)
函數有兩個參數:x
和n
,這兩個參數都是位置參數,調用函數時,傳入的兩個值按照位置順序依次賦給參數x
和n
。
2、默認參數
def power(x, n=2):
s = 1
while n > 0:
n = n - 1
s = s * x
return s
一是必選參數在前,默認參數在後,否則Python的解釋器會報錯(思考一下爲什麼默認參數不能放在必選參數前面);
二是如何設置默認參數。
當函數有多個參數時,把變化大的參數放前面,變化小的參數放後面。變化小的參數就可以作爲默認參數。
使用默認參數有什麼好處?最大的好處是能降低調用函數的難度。
有多個默認參數時,調用的時候,既可以按順序提供默認參數,比如調用enroll('Bob', 'M', 7)
,意思是,除了name
,gender
這兩個參數外,最後1個參數應用在參數age
上,city
參數由於沒有提供,仍然使用默認值。
也可以不按順序提供部分默認參數。當不按順序提供部分默認參數時,需要把參數名寫上。比如調用enroll('Adam', 'M', city='Tianjin')
,意思是,city
參數用傳進去的值,其他默認參數繼續使用默認值。
定義默認參數要牢記一點:默認參數必須指向不變對象!
2、可變參數
def calc(*numbers):
sum = 0
for n in numbers:
sum = sum + n * n
return sum
定義可變參數和定義一個list或tuple參數相比,僅僅在參數前面加了一個*
號。在函數內部,參數numbers
接收到的是一個tuple,因此,函數代碼完全不變。但是,調用該函數時,可以傳入任意個參數,包括0個參數:
>>> nums = [1, 2, 3]
>>> calc(*nums)
14
*nums
表示把nums
這個list的所有元素作爲可變參數傳進去。這種寫法相當有用,而且很常見。
3、關鍵字參數
def person(name, age, **kw):
print('name:', name, 'age:', age, 'other:', kw)
>>> 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
這兩個參數,但是,如果調用者願意提供更多的參數,我們也能收到。試想你正在做一個用戶註冊的功能,除了用戶名和年齡是必填項外,其他都是可選項,利用關鍵字參數來定義這個函數就能滿足註冊的需求。
>>> extra = {'city': 'Beijing', 'job': 'Engineer'}
>>> person('Jack', 24, **extra)
name: Jack age: 24 other: {'city': 'Beijing', 'job': 'Engineer'}
**extra
表示把extra
這個dict的所有key-value用關鍵字參數傳入到函數的**kw
參數,kw
將獲得一個dict,注意kw
獲得的dict是extra
的一份拷貝,對kw
的改動不會影響到函數外的extra
。
4、命名關鍵字參數
用命名關鍵字參數,例如,只接收city
和job
作爲關鍵字參數。這種方式定義的函數如下:
def person(name, age, *, city, job):
print(name, age, city, job)
如果函數定義中已經有了一個可變參數,後面跟着的命名關鍵字參數就不再需要一個特殊分隔符*
了:
def person(name, age, *args, city, job):
print(name, age, args, city, job)
綜合:在Python中定義函數,可以用必選參數、默認參數、可變參數、關鍵字參數和命名關鍵字參數,這5種參數都可以組合使用。但是請注意,參數定義的順序必須是:必選參數、默認參數、可變參數、命名關鍵字參數和關鍵字參數。
*args
是可變參數,args接收的是一個tuple;
**kw
是關鍵字參數,kw接收的是一個dict。