對于初學者來說,固定參數(shù)的使用都會使用迟赃,這兩個參數(shù)不知道并不會影響寫代碼。其實很多時候Python的技巧在于厂镇,你懂得更多高級的語法會寫出更漂亮的代碼纤壁。可變參數(shù)有兩種:
1剪撬、args是任意參數(shù)
2摄乒、kwargs關(guān)鍵詞參數(shù)
Python的參數(shù)
一般情況下悠反,函數(shù)的形參是固定寫好的残黑,比如:
def hello(name, age):
print "do something ..."
print name, age
這樣的寫法似乎沒有問題,仔細思考會發(fā)現(xiàn)斋否,如果多層函數(shù)封裝好了梨水,突然接到BOSS的一個指令需要添加參數(shù),怎么辦茵臭?代碼如何擴展疫诽,于是代碼從最上層開始一直加到最底層嗎?解決的辦法就是每層封裝的時候添加可變參數(shù)旦委,用于擴展奇徒。
1、args
這個參數(shù)使用通常帶上一個星號*
缨硝,直接看代碼:
def hello(*args):
print "do something..."
print args
>>> hello("Tom", "12")
do something...
('Tom', '12')
多個參數(shù)存儲在args的元組中摩钙,改變輸入?yún)?shù)的順序,元組中的args也會改變查辩。與上面的例子合起來一起:
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',)
如果只輸入兩個參數(shù)胖笛,那么可變參數(shù)args就是一個空元組。只要超過2個參數(shù)宜岛,多余的就會存儲在args元組中长踊,其實就這么簡單。
2萍倡、kwargs
這個可變參數(shù)是以關(guān)鍵詞參數(shù)形式輸入的身弊,先來看一個簡單例子:
def hello(**kwargs):
print kwargs
>>>hello(name="Black")
{'name': 'black'}
>>> hello(name="Tom", age="22")
{'age': '22', 'name': 'Tom'}
當輸入不定個數(shù)的參數(shù)時,關(guān)鍵詞作為字典的key,參數(shù)作為值保存在kwargs中佑刷,現(xiàn)在明白了吧莉擒。當輸入?yún)?shù)是字典時會發(fā)生什么情況呢?
def hello(**kwargs):
print kwargs
>>> d = dict(name="Tom", age=22)
>>>hello(**d)
{'age': '22', 'name': 'Tom'}
輸入完全一樣瘫絮,相當于直接輸出字典d
涨冀,由此對于數(shù)據(jù)庫連接,日志配置一種簡單的情況就是配置成字典麦萤,然后直接傳入字典鹿鳖,代碼變得更加簡潔。(如果不明白壮莹,出門找數(shù)據(jù)庫操作翅帜,找不到就說明我還沒有更新)
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ù)的輸入記住一個原則任意參數(shù)必須放在關(guān)鍵詞參數(shù)前面命满,hello(name="Black", age="22", "177", hobby="math")
你本以為前兩個參數(shù)是定義好的涝滴,第三個參數(shù)會存儲到args元組中,最后一個參數(shù)會存儲kwargs的字典中胶台,這就錯了歼疮。
小結(jié)
對于可變參數(shù)有兩種
- args 存儲任意參數(shù)
- kwargs存儲關(guān)鍵詞參數(shù)
- 任意參數(shù)一定要放在關(guān)鍵詞參數(shù)前面
思考
如果改變這兩個參數(shù)的名稱對結(jié)果會有影響嗎?
hello(name, age, *ag, **kw):
print name, age
print ag
print kw