|
先說說函數(shù)定義,我們都知道,下面的代碼定義了一個(gè)函數(shù)funcA
def funcA():
下面這個(gè)函數(shù)funcB就有兩個(gè)參數(shù)了,
我們可以在函數(shù)定義中使用參數(shù)默認(rèn)值,比如
我們要定義一個(gè)函數(shù)的時(shí)候,必須要預(yù)先定義這個(gè)函數(shù)需要多少個(gè)參數(shù)(或者說可以接受多少個(gè)參數(shù))。一般情況下這是沒問題的,但是也有在定義函數(shù)的時(shí)候,不能知道參數(shù)個(gè)數(shù)的情況(想一想C語言里的printf函數(shù)),在Python里,帶*的參數(shù)就是用來接受可變數(shù)量參數(shù)的。看一個(gè)例子 好了,一顆星我們弄清楚了,下面輪到兩顆星。
上面的例子里,調(diào)用函數(shù)的時(shí)候,傳遞的參數(shù)都是根據(jù)位置來跟函數(shù)定義里的參數(shù)表匹配的,比如funcB(100, 99)和funcB(99, 100)的執(zhí)行結(jié)果是不一樣的。在Python里,還支持一種用關(guān)鍵字參數(shù)(keyword argument)調(diào)用函數(shù)的辦法,也就是在調(diào)用函數(shù)的時(shí)候,明確指定參數(shù)值付給那個(gè)形參。比如還是上面的funcB(a, b),我們通過這兩種方式調(diào)用
另外,在函數(shù)調(diào)用中,可以混合使用基于位置匹配的參數(shù)和關(guān)鍵字參數(shù),前題是先給出固定位置的參數(shù),比如
好了,經(jīng)過以上鋪墊,兩顆星總算可以出場(chǎng)了: 常規(guī)參數(shù),*參數(shù)及**參數(shù)可以同時(shí)使用,具體怎么用?看看Python Reference Manual吧,關(guān)于Function definitions的那些章節(jié)。其實(shí),笨想也能猜出來啊,o(∩_∩)o... 綜上: *—>() 元組tuple **—>{} 字典dict
對(duì)于參數(shù)解包: 例如在built-in模塊中的range()函數(shù),默認(rèn)是接受兩個(gè)參數(shù)_start和_stop。如果他們不能分開寫,我們就可以用*運(yùn)算符來直接解包tuple或者list。 即,tuple和list可以運(yùn)用*運(yùn)算法來存儲(chǔ)keywords參數(shù)。 >>> range(3, 6) # normal call with separate arguments[3, 4, 5] >>> args = [3, 6]>>> range(*args) # call with arguments unpacked from a list[3, 4, 5] 因此,相同的方式,dict類型可以通過**運(yùn)算符用來存儲(chǔ)關(guān)鍵字參數(shù)。 >>> def parrot(voltage, state='a stiff', action='voom'): ... print "-- This parrot wouldn't", action, ... print "if you put", voltage, "volts through it.", ... print "E's", state, "!" ... >>> d = {"voltage": "four million", "state": "bleedin' demised", "action": "VOOM"} >>> parrot(**d) -- This parrot wouldn't VOOM if you put four million volts through it. E's bleedin' demised ! |
|
|