十一、python基礎:函數各種參數的用法

十一、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)

看一下輸出結果:
在這裏插入圖片描述
最後看一下函數體中不使用星號進行解包,會輸出什麼結果。
在這裏插入圖片描述

關於函數參數的建議:
注意最好不要使用可變類型數據容器,作爲默認參數,也就是列表、字典這些,雖然你作爲默認參數它不會報錯,但是有時候會造成一些奇怪的問題。

這個問題我的另一篇文章有具體說到:

python的大坑:使用空列表作爲默認參數,讓我懷疑遇到了靈異代碼

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章