5-2 深入函數(shù)-定義與調(diào)用

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ù)change_para_num()有三種類型的參數(shù),并且?guī)?的參數(shù)放在最前面,第一次調(diào)用時(shí)給出了3個(gè)位置參數(shù)和一個(gè)關(guān)鍵字參數(shù)。因此tpl收集了1,2,3作為一個(gè)元組,變量a取得值5,變量b使用了默認(rèn)值;第二次調(diào)用沒有提供關(guān)鍵字參數(shù),無默認(rèn)值的參數(shù)a沒有獲得值,所以調(diào)用失敗。

使用元組來收集參數(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ù))

代碼中定義了change_para_dct()函數(shù),其最后一個(gè)參數(shù)前有**,即為收集關(guān)鍵字參數(shù)到字典中。調(diào)用時(shí)給出兩個(gè)多余的關(guān)鍵字參數(shù),運(yùn)行時(shí)會(huì)被放入名稱為adct的字典中。

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

示例:(帶有大量默認(rèn)參數(shù)的函數(shù)及其調(diào)用)

代碼中定義了一個(gè)函數(shù)cube(),其參數(shù)為兩個(gè),第一個(gè)是普通參數(shù)name,第二個(gè)為收集關(guān)鍵字參數(shù)。函數(shù)體中給了一個(gè)默認(rèn)參數(shù)的字典,然后用字典的update()函數(shù)將調(diào)用時(shí)提供的關(guān)鍵字參數(shù)更新至默認(rèn)參數(shù)的字典。

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)的‘陷阱’)

代碼中只定義了一個(gè)帶有空列表默認(rèn)參數(shù)的函數(shù)myfun(),然后在不提供參數(shù)的情況下調(diào)用了三次這個(gè)函數(shù)。

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

改進(jìn):

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,506評(píng)論 19 139
  • 前言 人生苦多,快來 Kotlin ,快速學(xué)習(xí)Kotlin! 什么是Kotlin? Kotlin 是種靜態(tài)類型編程...
    任半生囂狂閱讀 26,669評(píng)論 9 118
  • 原文地址:C語言函數(shù)調(diào)用棧(一)C語言函數(shù)調(diào)用棧(二) 0 引言 程序的執(zhí)行過程可看作連續(xù)的函數(shù)調(diào)用。當(dāng)一個(gè)函數(shù)執(zhí)...
    小豬啊嗚閱讀 4,956評(píng)論 1 19
  • //Clojure入門教程: Clojure – Functional Programming for the J...
    葡萄喃喃囈語閱讀 4,021評(píng)論 0 7
  • 他們說鍵牌敲出來的愛情能有多堅(jiān)固,可是我和他每天用手機(jī)鍵盤互訴思念一年之久,感情卻日漸深入;他們說沒有物質(zhì)基礎(chǔ)的愛...
    恬妞愛送糖閱讀 217評(píng)論 0 0

友情鏈接更多精彩內(nèi)容