5-2 深入函數-定義與調用

1.默認值參數

在Python中,可以在聲明函數的時候,預先為參數設置一個默認值,當調用函數,如果某個參數具有默認值,則可以不向參數傳遞該參數,這時,函數將使用聲明函數時為該參數設置的默認值來運行。

形式如下:

def ? <函數名> ? (參數=默認值)

? ? ? ? ?<語句>

示例:

如果聲明一函數時,其參數列表中既包含無默認值參數,又包含有默認值的參數,那么在聲明函數的參數時,必須先聲明無默認值參數,后聲明有默認值參數

如果一個函數具有多個參數,而且這些參數都具有默認值,在調用函數的時候,可能僅想向最后一個參數傳遞值,以下為示例:

只有一個參數傳入時,變量hi得到了Jondon的。要想將調用時僅給的一個參數賦予第二個變量,就必須向指定的參數傳遞值,具體見下節。

2.參數傳遞

在Python中參數值的傳遞是按照聲明函數時參數的位置順序進行傳遞的,即位置參數,調用時提供的第一個參數值會被聲明時的參數列表中的第一個參數獲取,其它的參數結合方法依次類推。Python提供了另一種傳遞參數的方法--按照參數名傳遞值得方法,即提供關鍵字參數,提供關鍵字參數的函數調用類似于定義函數時設置參數的默認值。

提供關鍵字參數調用函數時,要在調用函數名后的圓括號里寫出形式為“關鍵字=參數值”的參數,這樣,調用函數時提供參數就不必嚴格按照該函數聲明時的順序來提供調用參數了。如果在函數調用時,既提供了關鍵字參數,又提供了位置參數,則位置參數就會被優先使用,如果參數結合時出現重復,則會發生運行錯誤。

對于上述示例,可以這樣調用:

hello(name='Jonson')

或:

hello(name='Jonson',hi='hi')

調用函數提供參數時,按順序傳入的參數要位于關鍵字前,而且不能有重復的情況。

交互式環境下示例:

3.可變數量參數傳遞

在自定義函數時,如果參數名前加上一個*號,則表示該參數就是一個可變長參數。在調用該函數時,如果依次序將所有的其他變量都賦予值之后,剩下的參數將會收集在一個元組中,元組的名稱就是前面帶*號的參數名。

示例:

當自定義函數時,參數中含有前面所介紹的三種類型的參數,則一般來說帶*的參數應放在最后。當帶*的參數放在最前面時,仍然可以正常工作,但調用時,后面的參數必須以關鍵字參數方式提供,否則因其后的位置參數無法獲取值而引發錯誤。

示例:

代碼中定義的函數change_para_num()有三種類型的參數,并且帶*的參數放在最前面,第一次調用時給出了3個位置參數和一個關鍵字參數。因此tpl收集了1,2,3作為一個元組,變量a取得值5,變量b使用了默認值;第二次調用沒有提供關鍵字參數,無默認值的參數a沒有獲得值,所以調用失敗。

使用元組來收集參數的參數時,調用時提供的參數不能為關鍵字參數,如果要收集不定數量的關鍵字參數可以在自定義函數時的參數前加兩顆星即**valuename,這樣一來,多余的關鍵字參數就可以以字典方式被收集到變量valuename中。

收集關鍵字參數時要放在函數聲明的參數列表中的所有參數之后。

示例:(收集關鍵字參數)

代碼中定義了change_para_dct()函數,其最后一個參數前有**,即為收集關鍵字參數到字典中。調用時給出兩個多余的關鍵字參數,運行時會被放入名稱為adct的字典中。

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

示例:(帶有大量默認參數的函數及其調用)

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

4.拆解序列的函數調用

前面使用函數調用時提供的參數都是位置參數和關鍵字參數,實際上調用函數是還可以把元組和字典進行拆解調用。

拆解元組 ? ? 提供位置參數

拆解字典 ? ? 提供關鍵字參數

調用時使用拆解元組的方法是在調用時提供的參數前加一個*;要拆解字典必須在提供的調用參數前加**。

示例:(拆解元組的函數調用)

5.函數調用時參數的傳遞方法

在函數調用時,若提供的是不可變參數,那么在函數內部對其進行修改時,在函數外部其值是不可變的;若提供的是可變參數,則在函數內部對它修改時,在函數外部其值也會改變的。

示例:(調用函數對提供的可變和不可變參數進行修改前后的效果)? ? ? ? ? ? ? ??

代碼中定義了一個修改提供參數的函數change(),參數包括一個整數和一個列表。在調用前定義并輸出了一個整數aint和一個列表alst,然后把他們作為參數調用change(),最后輸出兩個變量的值。

示例:(使用列表作為默認參數時出現的‘陷阱’)

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

運行結果:

改進:

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,106評論 6 542
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,441評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,211評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,736評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,475評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,834評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,829評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,009評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,559評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,306評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,516評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,038評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,728評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,132評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,443評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,249評論 3 399
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,484評論 2 379

推薦閱讀更多精彩內容