十一、python基礎:函數各種參數的用法
1、爲什麼函數要有參數?
我們封裝成一個函數的目的就是爲了讓它可以重複使用,如果想要讓函數能適應更多的情況,我們就要給函數預留參數,可以讓用戶自己傳入參數,處理不同條件下的需求。
2、函數的參數有哪些種類?
在python中,函數的參數可以分爲以下幾種:
位置參數、關鍵字參數、默認參數、多值參數
2.1、位置參數
def get_info(name, age, height):
print(name)
print(age, height)
這上面的get_info函數總共有三個參數:name, age, height。
它們是不是位置參數,取決於你調用的時候,是怎麼給它傳參的。
舉例:
我們來看一下調用的時候,按照位置參數去傳參是怎麼樣的
def get_info(name, age, height):
print(name)
print(age, height)
get_info('小明', 12, 180) # 正確調用方式
get_info(12, '小明', 180) # 錯誤調用方式,位置錯了
get_info('小明', 12) # 錯誤調用方式,參數缺少了
位置參數注意:
1、按照位置參數傳參的時候,一定要注意位置不能放錯了,否則函數獲取到的數據就不對。
2、位置參數的數量是不能多也不能少的,定義函數時有3個位置參數,調用函數的時候,就必須傳3個參數。
3、定義一個函數時,不管它有多少種類的參數,位置參數永遠是放在其他類型參數前面的。
2.2、關鍵字參數
如果你不想按照位置的順序給函數傳參,也可以使用關鍵字參數傳參。
def get_info(name, age, height):
print(name)
print(age, height)
get_info(age=12, name='小明', height=180)
按照這樣鍵值對的方式傳參,即使你的位置順序放錯了也不要緊,只要關鍵字寫對了就行,看一下執行的結果:
2.3、默認參數(缺省參數)
默認參數也叫缺省參數,也就是你在傳參時,可以不傳這個參數,函數本身會給設置它一個默認值,你不傳參就使用默認值。
一個參數是不是默認參數,不是取決於你調用時傳參的方式,而是取決於定義時,有沒有給這個參數設置默認值的。
我們把上面的函數稍微改一下,改成下面這樣,給了height一個默認值180,在調用它的時候,我們可以傳參,也可以不傳,看看運行結果
def get_info(name, age, height=180):
print(name)
print(age, height)
get_info(age=12, name='小明')
get_info(age=12, name='xiaoming', height=170)
還是可以正常輸出的,調用時如果有給默認參數傳參,它就使用你傳的參數,沒有的話,就使用原本定義時設置的默認值。
注意:默認參數必須是在位置參數之後,我們來演示一下,給age一個默認值,放在中間,看看有什麼效果。
def get_info(name, age=12, height):
print(name)
print(age, height)
get_info(12, 170)
結果會報錯:
2.4、多值參數
有時候我們在定義函數的時候,允許用戶傳很多參數,但是參數的個數還不確定,這時候就可以使用多值參數了。
多值參數有2種表示方法,對應傳不同類型的數據:
*args表示接收一個元組,元組的長度不作限制;
**kwargs表示接收一個字典,字典的長度不作限制;
def get_info(name, age, *args, **kwargs):
print(name, age)
print(*args)
print(*kwargs)
t = (123, 345)
d = {'phone': '156XXX'}
get_info('小明', 12, t, d)
這裏有個需要注意的地方:
我們在參數上是使用了"*args"和“**kwargs”,這是爲了向解釋器表達,我們要收集一個元組和一個字典。而在函數體中,我們使用的是“*args”和“*kwargs”,不管是args還是kwargs,前面都只有一個星號,這裏不再表示收集的意思。而是向解釋器表達,我們想要將收集到的元組和字典進行解包,就是你要一個一個元素給我拎出來,不要按照整體一個元組和一個字典輸出。當然,如果你使用的是“args”和“kwargs”,它將會按照整體輸出。
看看運行結果:
這個結果看起來貌似沒毛病對吧。
但是,其實它是有問題的!!!
看它的輸出,我們明明在函數中設置了3次print(),打印出來的結果就應該是3行的,但爲什麼結果只輸出了2行?可是打印出來的內容卻沒有缺少,全都輸出了。
這裏還有一點需要特別注意,上面造成這個問題的原因,是解釋器把你傳的2個參數t和d都收集到*args裏面了,而**kwargs就沒有收集到參數,因此,打印出來的只有2行。
解決方法:
在傳參的時候,分別給2個參數加上符號*和**。
def get_info(name, age, *args, **kwargs):
print(name, age)
print(*args)
print(*kwargs)
t = (123, 345)
d = {'phone': '1560000'}
get_info('小明', 12, *t, **d)
看一下輸出結果:
最後看一下函數體中不使用星號進行解包,會輸出什麼結果。
關於函數參數的建議:
注意最好不要使用可變類型數據容器,作爲默認參數,也就是列表、字典這些,雖然你作爲默認參數它不會報錯,但是有時候會造成一些奇怪的問題。
這個問題我的另一篇文章有具體說到: