1.默認(rèn)值參數(shù)
在Python中,可以在聲明函數(shù)的時(shí)候,預(yù)先為參數(shù)設(shè)置一個(gè)默認(rèn)值,當(dāng)調(diào)用函數(shù),如果某個(gè)參數(shù)具有默認(rèn)值,則可以不向參數(shù)傳遞該參數(shù),這時(shí),函數(shù)將使用聲明函數(shù)時(shí)為該參數(shù)設(shè)置的默認(rèn)值來運(yùn)行。
形式如下:
def ? <函數(shù)名> ? (參數(shù)=默認(rèn)值)
? ? ? ? ?<語句>
示例:

如果聲明一函數(shù)時(shí),其參數(shù)列表中既包含無默認(rèn)值參數(shù),又包含有默認(rèn)值的參數(shù),那么在聲明函數(shù)的參數(shù)時(shí),必須先聲明無默認(rèn)值參數(shù),后聲明有默認(rèn)值參數(shù)。
如果一個(gè)函數(shù)具有多個(gè)參數(shù),而且這些參數(shù)都具有默認(rèn)值,在調(diào)用函數(shù)的時(shí)候,可能僅想向最后一個(gè)參數(shù)傳遞值,以下為示例:

只有一個(gè)參數(shù)傳入時(shí),變量hi得到了Jondon的。要想將調(diào)用時(shí)僅給的一個(gè)參數(shù)賦予第二個(gè)變量,就必須向指定的參數(shù)傳遞值,具體見下節(jié)。
2.參數(shù)傳遞
在Python中參數(shù)值的傳遞是按照聲明函數(shù)時(shí)參數(shù)的位置順序進(jìn)行傳遞的,即位置參數(shù),調(diào)用時(shí)提供的第一個(gè)參數(shù)值會(huì)被聲明時(shí)的參數(shù)列表中的第一個(gè)參數(shù)獲取,其它的參數(shù)結(jié)合方法依次類推。Python提供了另一種傳遞參數(shù)的方法--按照參數(shù)名傳遞值得方法,即提供關(guān)鍵字參數(shù),提供關(guān)鍵字參數(shù)的函數(shù)調(diào)用類似于定義函數(shù)時(shí)設(shè)置參數(shù)的默認(rèn)值。
提供關(guān)鍵字參數(shù)調(diào)用函數(shù)時(shí),要在調(diào)用函數(shù)名后的圓括號(hào)里寫出形式為“關(guān)鍵字=參數(shù)值”的參數(shù),這樣,調(diào)用函數(shù)時(shí)提供參數(shù)就不必嚴(yán)格按照該函數(shù)聲明時(shí)的順序來提供調(diào)用參數(shù)了。如果在函數(shù)調(diào)用時(shí),既提供了關(guān)鍵字參數(shù),又提供了位置參數(shù),則位置參數(shù)就會(huì)被優(yōu)先使用,如果參數(shù)結(jié)合時(shí)出現(xiàn)重復(fù),則會(huì)發(fā)生運(yùn)行錯(cuò)誤。
對(duì)于上述示例,可以這樣調(diào)用:
hello(name='Jonson')
或:
hello(name='Jonson',hi='hi')
調(diào)用函數(shù)提供參數(shù)時(shí),按順序傳入的參數(shù)要位于關(guān)鍵字前,而且不能有重復(fù)的情況。
交互式環(huán)境下示例:

3.可變數(shù)量參數(shù)傳遞
在自定義函數(shù)時(shí),如果參數(shù)名前加上一個(gè)*號(hào),則表示該參數(shù)就是一個(gè)可變長參數(shù)。在調(diào)用該函數(shù)時(shí),如果依次序?qū)⑺械钠渌兞慷假x予值之后,剩下的參數(shù)將會(huì)收集在一個(gè)元組中,元組的名稱就是前面帶*號(hào)的參數(shù)名。
示例:

當(dāng)自定義函數(shù)時(shí),參數(shù)中含有前面所介紹的三種類型的參數(shù),則一般來說帶*的參數(shù)應(yīng)放在最后。當(dāng)帶*的參數(shù)放在最前面時(shí),仍然可以正常工作,但調(diào)用時(shí),后面的參數(shù)必須以關(guān)鍵字參數(shù)方式提供,否則因其后的位置參數(shù)無法獲取值而引發(fā)錯(cuò)誤。
示例:

使用元組來收集參數(shù)的參數(shù)時(shí),調(diào)用時(shí)提供的參數(shù)不能為關(guān)鍵字參數(shù),如果要收集不定數(shù)量的關(guān)鍵字參數(shù)可以在自定義函數(shù)時(shí)的參數(shù)前加兩顆星即**valuename,這樣一來,多余的關(guān)鍵字參數(shù)就可以以字典方式被收集到變量valuename中。
收集關(guān)鍵字參數(shù)時(shí)要放在函數(shù)聲明的參數(shù)列表中的所有參數(shù)之后。
示例:(收集關(guān)鍵字參數(shù))

這種收集字典的方式為函數(shù)中使用大量默認(rèn)值提供了方便,不用把大量的默認(rèn)值全放在函數(shù)聲明的參數(shù)中,而是把它放入程序中。
示例:(帶有大量默認(rèn)參數(shù)的函數(shù)及其調(diào)用)

4.拆解序列的函數(shù)調(diào)用
前面使用函數(shù)調(diào)用時(shí)提供的參數(shù)都是位置參數(shù)和關(guān)鍵字參數(shù),實(shí)際上調(diào)用函數(shù)是還可以把元組和字典進(jìn)行拆解調(diào)用。
拆解元組 ? ? 提供位置參數(shù)
拆解字典 ? ? 提供關(guān)鍵字參數(shù)
調(diào)用時(shí)使用拆解元組的方法是在調(diào)用時(shí)提供的參數(shù)前加一個(gè)*;要拆解字典必須在提供的調(diào)用參數(shù)前加**。
示例:(拆解元組的函數(shù)調(diào)用)

5.函數(shù)調(diào)用時(shí)參數(shù)的傳遞方法
在函數(shù)調(diào)用時(shí),若提供的是不可變參數(shù),那么在函數(shù)內(nèi)部對(duì)其進(jìn)行修改時(shí),在函數(shù)外部其值是不可變的;若提供的是可變參數(shù),則在函數(shù)內(nèi)部對(duì)它修改時(shí),在函數(shù)外部其值也會(huì)改變的。


示例:(調(diào)用函數(shù)對(duì)提供的可變和不可變參數(shù)進(jìn)行修改前后的效果)? ? ? ? ? ? ? ??
代碼中定義了一個(gè)修改提供參數(shù)的函數(shù)change(),參數(shù)包括一個(gè)整數(shù)和一個(gè)列表。在調(diào)用前定義并輸出了一個(gè)整數(shù)aint和一個(gè)列表alst,然后把他們作為參數(shù)調(diào)用change(),最后輸出兩個(gè)變量的值。
示例:(使用列表作為默認(rèn)參數(shù)時(shí)出現(xiàn)的‘陷阱’)

運(yùn)行結(jié)果:

改進(jìn):
