對(duì)于初學(xué)者來說,固定參數(shù)的使用都會(huì)使用,這兩個(gè)參數(shù)不知道并不會(huì)影響寫代碼高每。其實(shí)很多時(shí)候Python的技巧在于,你懂得更多高級(jí)的語(yǔ)法會(huì)寫出更漂亮的代碼南捂⌒粒可變參數(shù)有兩種:
1夯膀、args是任意參數(shù)
2诗充、kwargs關(guān)鍵詞參數(shù)
Python的參數(shù)
一般情況下,函數(shù)的形參是固定寫好的,比如:
def hello(name, age):
print "do something ..."
print name, age
這樣的寫法似乎沒有問題,仔細(xì)思考會(huì)發(fā)現(xiàn),如果多層函數(shù)封裝好了,突然接到BOSS的一個(gè)指令需要添加參數(shù),怎么辦?代碼如何擴(kuò)展,于是代碼從最上層開始一直加到最底層嗎?解決的辦法就是每層封裝的時(shí)候添加可變參數(shù),用于擴(kuò)展。
1诱建、args
這個(gè)參數(shù)使用通常帶上一個(gè)星號(hào)*,直接看代碼:
def hello(*args):
print "do something..."
print args
hello("Tom", "12")
do something...
('Tom', '12')
多個(gè)參數(shù)存儲(chǔ)在args的元組中,改變輸入?yún)?shù)的順序,元組中的args也會(huì)改變蝴蜓。與上面的例子合起來一起:
def hello(name, age, *args):
print "do something..."
print name, age
print args
hello("Tom", "12")
do something...
Tom 12
()
hello("Tom", "12", "Black")
do something...
Tom 12
('Black',)
如果只輸入兩個(gè)參數(shù),那么可變參數(shù)args就是一個(gè)空元組。只要超過2個(gè)參數(shù),多余的就會(huì)存儲(chǔ)在args元組中,其實(shí)就這么簡(jiǎn)單俺猿。
2茎匠、kwargs
這個(gè)可變參數(shù)是以關(guān)鍵詞參數(shù)形式輸入的,先來看一個(gè)簡(jiǎn)單例子:
def hello(**kwargs):
print kwargs
hello(name="Black")
{'name': 'black'}
hello(name="Tom", age="22")
{'age': '22', 'name': 'Tom'}
當(dāng)輸入不定個(gè)數(shù)的參數(shù)時(shí),關(guān)鍵詞作為字典的key,參數(shù)作為值保存在kwargs中,現(xiàn)在明白了吧。當(dāng)輸入?yún)?shù)是字典時(shí)會(huì)發(fā)生什么情況呢?
def hello(**kwargs):
print kwargs
d = dict(name="Tom", age=22)
hello(**d)
{'age': '22', 'name': 'Tom'}
輸入完全一樣,相當(dāng)于直接輸出字典d,由此對(duì)于數(shù)據(jù)庫(kù)連接,日志配置一種簡(jiǎn)單的情況就是配置成字典,然后直接傳入字典,代碼變得更加簡(jiǎn)潔押袍。(如果不明白,出門找數(shù)據(jù)庫(kù)操作,找不到就說明我還沒有更新)
3诵冒、混合參數(shù)
def hello(name, age, *args, **kwargs):
print name, age
print args
print kwargs
hello("Black", "22", "177", hobby="math")
Black 22
('177',)
{'hobby': 'math'}
hello("Black", "22", length="177", hobby="math")
Black 22
()
{'hobby': 'math', 'length': '177'}
hello(name="Black", age="22", length="177", hobby="math")
Black 22
()
{'hobby': 'math', 'length': '177'}
混合參數(shù)的輸入記住一個(gè)原則任意參數(shù)必須放在關(guān)鍵詞參數(shù)前面,hello(name="Black", age="22", "177", hobby="math")你本以為前兩個(gè)參數(shù)是定義好的,第三個(gè)參數(shù)會(huì)存儲(chǔ)到args元組中,最后一個(gè)參數(shù)會(huì)存儲(chǔ)kwargs的字典中,這就錯(cuò)了。
小結(jié)
對(duì)于可變參數(shù)有兩種
args 存儲(chǔ)任意參數(shù)
kwargs存儲(chǔ)關(guān)鍵詞參數(shù)
任意參數(shù)一定要放在關(guān)鍵詞參數(shù)前面