如上面文章1,上面文章2所講,python中的函數(shù)最常用的參數(shù)形式有位置參數(shù)和默認(rèn)參數(shù),但還有一些比較實(shí)用的參數(shù)形式,比如本文中講到的可變參數(shù)和關(guān)鍵字參數(shù)??勺儏?shù)和關(guān)鍵字參數(shù)在定義和使用時(shí)的形式很相似很規(guī)整,所以本文對(duì)這兩個(gè)類型的參數(shù)做一個(gè)介紹和對(duì)比。
一:可變參數(shù)
在python函數(shù)中,還可以定義可變參數(shù)。可變參數(shù)是指傳入的參數(shù)個(gè)數(shù)可變,可以是一個(gè),兩個(gè)或者多個(gè),也可以是0個(gè),形式如下:
def calc(*numbers):
sums = 0
for num in numbers:
sums += num
return sums
可以看到,定義一個(gè)可變參數(shù)和定義一個(gè)list或者tuple參數(shù)相比,前面多了一個(gè)星號(hào)。而函數(shù)調(diào)用方可以傳入0個(gè)到多個(gè)參數(shù)。在函數(shù)內(nèi)部,參數(shù)numbers接收到的是一個(gè)tuple,所以函數(shù)代碼相比較傳入一個(gè)list或者tuple參數(shù)的函數(shù)來說,代碼是一樣的。
小問題:如果現(xiàn)在已經(jīng)有一個(gè)list或者tuple變量想傳給可變函數(shù)作為參數(shù)怎么辦,難道還要手動(dòng)打散再傳過來嗎?不用。靈活的python運(yùn)行將list或者tuple直接作為參數(shù)傳過來,只需要在list或者tuple前面加一個(gè)*號(hào)即可:
res1 = calc(1,2,3) #傳入多個(gè)參數(shù)
res2 = calc(*[1,2,3]) #傳入一個(gè)list
res3 = calc(*(1,2,3)) #傳入一個(gè)tuple
print(res1) #結(jié)果為6
print(res2) #結(jié)果為6
print(res3) #結(jié)果為6
這種把list或者tuple直接傳進(jìn)去作為多個(gè)可變參數(shù)的寫法非常有用,且很常見。
二:關(guān)鍵字參數(shù)
可變參數(shù)允許你傳入0個(gè)或任意個(gè)參數(shù),這些可變參數(shù)在函數(shù)調(diào)用時(shí)自動(dòng)組裝為一個(gè)tuple。而關(guān)鍵字參數(shù)允許你傳入0個(gè)或任意個(gè)含參數(shù)名的參數(shù),這些關(guān)鍵字參數(shù)在函數(shù)內(nèi)部自動(dòng)組裝為一個(gè)dict。請(qǐng)看示例:
def person(name, age, **kw):
print('name is :', name, 'age is :', age, 'other is :',kw)
person('Michael', 30)
person('Bob', 35, city='Beijing')
person('Adam', 45, gender='M', job='Engineer')
運(yùn)行結(jié)果:
E:\python_study>python 1.py
('name is :', 'Michael', 'age is :', 30, 'other is :', {})
('name is :', 'Bob', 'age is :', 35, 'other is :', {'city': 'Beijing'})
('name is :', 'Adam', 'age is :', 45, 'other is :', {'gender': 'M', 'job': 'Engineer'})
可以看到,關(guān)鍵字參數(shù)kw前面帶兩個(gè)星號(hào),可變參數(shù)前面是帶一個(gè)星號(hào)。
同樣的問題:如果現(xiàn)在已經(jīng)有一個(gè)dict想傳給函數(shù)作為關(guān)鍵字參數(shù)怎么辦,難道還要手動(dòng)打散再傳過來嗎?不用。靈活的python運(yùn)行將dict直接作為參數(shù)傳過來,只需要在dict前面加兩個(gè)星號(hào)即可:
extra = {'city':'Beijing', 'job':'Engineer'}
person('Jack', 24, **extra)
運(yùn)行結(jié)果同樣為:
E:\python_study>python 1.py
('name is :', 'Jack', 'age is :', 24, 'other is :', {'city': 'Beijing', 'job': 'Engineer'})
關(guān)鍵字參數(shù)有什么用?它可以擴(kuò)展函數(shù)的功能。比如,在person函數(shù)里,我們保證能接收到name和age這兩個(gè)參數(shù),但是,如果調(diào)用者愿意提供更多的參數(shù),我們也能收到。試想你正在做一個(gè)用戶注冊(cè)的功能,除了用戶名和年齡是必填項(xiàng)外,其他都是可選項(xiàng),利用關(guān)鍵字參數(shù)來定義這個(gè)函數(shù)就能滿足注冊(cè)的需求。
本文主要是對(duì)python中函數(shù)的可變參數(shù)和關(guān)鍵字參數(shù)的定義,用法做一個(gè)對(duì)比。python中函數(shù)的參數(shù)當(dāng)然還有其他的特性,比如限制命名關(guān)鍵字參數(shù)等用法,再次不贅述。
參考:
函數(shù)的參數(shù)