1.默認值參數
在Python中,可以在聲明函數的時候,預先為參數設置一個默認值,當調用函數,如果某個參數具有默認值,則可以不向參數傳遞該參數,這時,函數將使用聲明函數時為該參數設置的默認值來運行。
形式如下:
def ? <函數名> ? (參數=默認值)
? ? ? ? ?<語句>
示例:
如果聲明一函數時,其參數列表中既包含無默認值參數,又包含有默認值的參數,那么在聲明函數的參數時,必須先聲明無默認值參數,后聲明有默認值參數。
如果一個函數具有多個參數,而且這些參數都具有默認值,在調用函數的時候,可能僅想向最后一個參數傳遞值,以下為示例:
只有一個參數傳入時,變量hi得到了Jondon的。要想將調用時僅給的一個參數賦予第二個變量,就必須向指定的參數傳遞值,具體見下節。
2.參數傳遞
在Python中參數值的傳遞是按照聲明函數時參數的位置順序進行傳遞的,即位置參數,調用時提供的第一個參數值會被聲明時的參數列表中的第一個參數獲取,其它的參數結合方法依次類推。Python提供了另一種傳遞參數的方法--按照參數名傳遞值得方法,即提供關鍵字參數,提供關鍵字參數的函數調用類似于定義函數時設置參數的默認值。
提供關鍵字參數調用函數時,要在調用函數名后的圓括號里寫出形式為“關鍵字=參數值”的參數,這樣,調用函數時提供參數就不必嚴格按照該函數聲明時的順序來提供調用參數了。如果在函數調用時,既提供了關鍵字參數,又提供了位置參數,則位置參數就會被優先使用,如果參數結合時出現重復,則會發生運行錯誤。
對于上述示例,可以這樣調用:
hello(name='Jonson')
或:
hello(name='Jonson',hi='hi')
調用函數提供參數時,按順序傳入的參數要位于關鍵字前,而且不能有重復的情況。
交互式環境下示例:
3.可變數量參數傳遞
在自定義函數時,如果參數名前加上一個*號,則表示該參數就是一個可變長參數。在調用該函數時,如果依次序將所有的其他變量都賦予值之后,剩下的參數將會收集在一個元組中,元組的名稱就是前面帶*號的參數名。
示例:
當自定義函數時,參數中含有前面所介紹的三種類型的參數,則一般來說帶*的參數應放在最后。當帶*的參數放在最前面時,仍然可以正常工作,但調用時,后面的參數必須以關鍵字參數方式提供,否則因其后的位置參數無法獲取值而引發錯誤。
示例:
使用元組來收集參數的參數時,調用時提供的參數不能為關鍵字參數,如果要收集不定數量的關鍵字參數可以在自定義函數時的參數前加兩顆星即**valuename,這樣一來,多余的關鍵字參數就可以以字典方式被收集到變量valuename中。
收集關鍵字參數時要放在函數聲明的參數列表中的所有參數之后。
示例:(收集關鍵字參數)
這種收集字典的方式為函數中使用大量默認值提供了方便,不用把大量的默認值全放在函數聲明的參數中,而是把它放入程序中。
示例:(帶有大量默認參數的函數及其調用)
4.拆解序列的函數調用
前面使用函數調用時提供的參數都是位置參數和關鍵字參數,實際上調用函數是還可以把元組和字典進行拆解調用。
拆解元組 ? ? 提供位置參數
拆解字典 ? ? 提供關鍵字參數
調用時使用拆解元組的方法是在調用時提供的參數前加一個*;要拆解字典必須在提供的調用參數前加**。
示例:(拆解元組的函數調用)
5.函數調用時參數的傳遞方法
在函數調用時,若提供的是不可變參數,那么在函數內部對其進行修改時,在函數外部其值是不可變的;若提供的是可變參數,則在函數內部對它修改時,在函數外部其值也會改變的。
示例:(調用函數對提供的可變和不可變參數進行修改前后的效果)? ? ? ? ? ? ? ??
代碼中定義了一個修改提供參數的函數change(),參數包括一個整數和一個列表。在調用前定義并輸出了一個整數aint和一個列表alst,然后把他們作為參數調用change(),最后輸出兩個變量的值。
示例:(使用列表作為默認參數時出現的‘陷阱’)
運行結果:
改進: