Python參數(shù)、參數(shù)類型、位置參數(shù)、默認(rèn)參數(shù)、可選參數(shù)舉例詳解
以下內(nèi)容基于Python3.13進(jìn)行講解,對(duì)于Python3.x來說下面的內(nèi)容都是支持的。
參數(shù)類型:
1、位置參數(shù)(Positional Arguments),必填參數(shù)
2、默認(rèn)值參數(shù)(Default Arguments),非必傳
3、可變參數(shù),非必傳,不限制參數(shù)個(gè)數(shù),比如說給多個(gè)人發(fā)郵件,發(fā)郵件的人數(shù)不確定
4、關(guān)鍵字參數(shù)(Keyword Arguments),非必傳,不限制參數(shù)個(gè)數(shù),會(huì)把傳過來的關(guān)鍵字參數(shù),放到一個(gè)字典里面,傳參的時(shí)候必須得用k=v這樣子來傳
5、命名關(guān)鍵字參數(shù)/強(qiáng)制關(guān)鍵字參數(shù)(Keyword-Only Arguments)
一、位置參數(shù)
也叫必傳參數(shù),順序參數(shù),是最重要的,也是必須在調(diào)用函數(shù)時(shí)明確提供的參數(shù)!位置參數(shù)必須按先后順序,一一對(duì)應(yīng),個(gè)數(shù)不多不少的傳遞!
定義:就是在給函數(shù)傳參數(shù)時(shí),按照順序,依次傳值。
def add(a,b): print('a:{}, b:{}'.format(a,b)) print(add(1,2)) #運(yùn)行結(jié)果: D:\App\python\python3.13.0\python.exe D:\WorkSpace-Python\Test\test.py a:1, b:2
在這個(gè)例子中,a和 b就是位置參數(shù),而且兩個(gè)值必傳,否則會(huì)報(bào)錯(cuò)。
二、默認(rèn)參數(shù)(Default Arguments)
默認(rèn)參數(shù)允許我們?cè)?strong>函數(shù)定義時(shí)為參數(shù)指定默認(rèn)值。如果調(diào)用函數(shù)時(shí)不傳遞該參數(shù),將使用默認(rèn)值。
def test(name,message='Boy'): print('name:{}, message:{}'.format(name,message)) test('Tom') #若不傳默認(rèn)參數(shù),則使用默認(rèn)值 test('Alice','Girl') # 輸出:name:Alice, message:Girl test('Alice',message = 'Girl') # 輸出:name:Alice, message:Girl #運(yùn)行結(jié)果: D:\App\python\python3.13.0\python.exe D:\WorkSpace-Python\Test\test.py name:Tom, message:Boy name:Alice, message:Girl name:Alice, message:Girl
默認(rèn)參數(shù)使用注意事項(xiàng)a. 默認(rèn)參數(shù)必須在位置參數(shù)后面,這樣才能被解釋器正確識(shí)別,否則會(huì)產(chǎn)生二義性。
def test(message='Boy',name): # SyntaxError: parameter without a default follows parameter with a default print('name:{}, message:{}'.format(name,message))
b. 默認(rèn)參數(shù)一定要指向不變對(duì)象!
def defaultzero(arr = []): #我們的本意是提供的arr參數(shù)為0時(shí) 返回只有一個(gè)0的arr arr.append(0) return arr print(defaultzero()) #輸出:[0] print(defaultzero()) #輸出:[0, 0] 顯然重復(fù)調(diào)用的時(shí)候結(jié)果不是我們所期望的 #解決方案 使用None def defaultzero1(arr = None): if arr == None: arr = [] arr.append(0) return arr print(defaultzero1()) #輸出:[0] print(defaultzero1()) #輸出:[0] 重復(fù)調(diào)用的時(shí)候,也輸出相同 #這說明arr是一個(gè)對(duì)象 #事實(shí)上Python所有的數(shù)據(jù)類型其實(shí)都是對(duì)象
說明:上面的答案可能與你想的不一樣,為什么呢?應(yīng)為在定義默認(rèn)函數(shù)時(shí),arr 為一個(gè)可變變量,在函數(shù)體被讀入內(nèi)存的時(shí)候,默認(rèn)參數(shù)arr指向的空列表對(duì)象就會(huì)被創(chuàng)建,arr的內(nèi)存地址不變,每次調(diào)用函數(shù)都像arr變量中添加0
結(jié)果說明python解釋器會(huì)將默認(rèn)參數(shù)作為一個(gè)公共對(duì)象來對(duì)待,多次調(diào)用含有默認(rèn)參數(shù)的函數(shù),就會(huì)進(jìn)行多次修改。
因此定義默認(rèn)參數(shù)時(shí)一定要使用不可變對(duì)象(int、float、str、tuple)。使用可變對(duì)象語法上沒錯(cuò),但在邏輯上是不安全的,代碼量非常大時(shí),容易產(chǎn)生很難查找的bug。
三、關(guān)鍵字參數(shù)
關(guān)鍵字參數(shù)(Keyword Arguments)是一種在函數(shù)調(diào)用時(shí)使用參數(shù)名稱來指定參數(shù)值的方式,不必按照定義形參的順序傳遞參數(shù)。
def person(name, age): print('name:{}, age:{}'.format(name, age)) # 使用關(guān)鍵字參數(shù)調(diào)用函數(shù) person(name='張三',age=20) #輸出:name:張三, age:20 person(age=31,name='李四') #輸出:name:李四, age:31
使用關(guān)鍵字參數(shù)調(diào)用函數(shù)對(duì)參數(shù)順序沒有要求。
既有位置參數(shù)又有關(guān)鍵字參數(shù),位置參數(shù)必須放到關(guān)鍵字參數(shù)前面否則報(bào)錯(cuò)
四、可變位置參數(shù)
可變位置參數(shù):Python函數(shù)提供了可變參數(shù),來方便進(jìn)行參數(shù)個(gè)數(shù)未知時(shí)的調(diào)用??勺儏?shù)將以tuple
元組形式傳遞。
定義:可變參數(shù)就是傳入的參數(shù)個(gè)數(shù)是可變的,可以是0個(gè),1個(gè),2個(gè),……很多個(gè)。作用:就是可以一次給函數(shù)傳很多的參數(shù)特征(格式):
*args
【*
參數(shù) (即在參數(shù)前加*
號(hào))】
def add(a,b): return a,b #上述函數(shù)若傳入多個(gè)參數(shù)則需要定義多個(gè)變量,可以簡(jiǎn)化為可變參數(shù)形式 def add1(*args): print('args:{}, type:{}'.format(args,type(args))) result = 0 for n in args: result = result + n return result # 調(diào)用函數(shù)1 print(add1(1,2,3)) # 調(diào)用函數(shù)2 tupleArray=(1,2,3) # *tupleArray這種方式很常見,很重要 print(add1(*tupleArray)) #輸出結(jié)果:6 # 調(diào)用函數(shù)3 listArray=[1,2,3] # *listArray這種方式很常見,很重要 # *listArray表示把listArray這個(gè)list中所有元素作為可變參數(shù)傳進(jìn)去 print(add1(*listArray)) #輸出結(jié)果:6 #運(yùn)行結(jié)果: D:\App\python\python3.13.0\python.exe D:\WorkSpace-Python\Test\test.py args:(1, 2, 3), type:<class 'tuple'> 6 args:(1, 2, 3), type:<class 'tuple'> 6 args:(1, 2, 3), type:<class 'tuple'> 6
可以發(fā)現(xiàn):*args的本質(zhì)就是把入?yún)⒁詔uple形式傳遞
關(guān)于*
星號(hào)的用法可以參考另一篇博文:《python中的*與**用法詳解》
五、可變關(guān)鍵字參數(shù)
關(guān)鍵字參數(shù):非必傳
。Python的可變位置參數(shù)以tuple形式傳遞,而關(guān)鍵字參數(shù)則是以dict形式傳遞
。 即可變參數(shù)傳遞的是參數(shù)值,關(guān)鍵字參數(shù)傳遞的是參數(shù)名:參數(shù)值鍵值對(duì)。
定義:關(guān)鍵字參數(shù)允許你傳入0個(gè)或任意個(gè)含參數(shù)名的參數(shù),這些關(guān)鍵字參數(shù)在函數(shù)內(nèi)部自動(dòng)組裝為一個(gè)dict。在調(diào)用函數(shù)時(shí),可以只傳入必選參數(shù):
def test(name,**kwargs): print("name:{}, kwargs:{}, kwargs-type:{}".format(name,kwargs,type(kwargs))) #案例一: test('張三') # 輸出:name:張三, kwargs:{}, kwargs-type:<class 'dict'> #案例二: test('張三',age=10) # 輸出:name:張三, kwargs:{'age': 10}, kwargs-type:<class 'dict'> #案例三: dictArray = {'city': 'Beijing', 'sex': '男'} test('李四', **dictArray ) # 輸出:name:李四, kwargs:{'city': 'Beijing', 'sex': '男'}, kwargs-type:<class 'dict'> #**dictArray表示把dictArray這個(gè)dict的所有key-value用關(guān)鍵字參數(shù)傳入到函數(shù)的**kwargs參數(shù),kwargs將獲得一個(gè)dict。注意kwargs獲得的dict是dictArray的一份拷貝,對(duì)kwargs的改動(dòng)不會(huì)影響到函數(shù)外的dictArray。 #運(yùn)行結(jié)果: D:\App\python\python3.13.0\python.exe D:\WorkSpace-Python\Test\test.py name:張三, kwargs:{}, kwargs-type:<class 'dict'> name:張三, kwargs:{'age': 10}, kwargs-type:<class 'dict'> name:李四, kwargs:{'city': 'Beijing', 'sex': '男'}, kwargs-type:<class 'dict'>
**
修飾的參數(shù)必須是最后一個(gè)**
修飾的參數(shù)必須以關(guān)鍵字的參數(shù)方式傳參,Python解釋器會(huì)將傳入的關(guān)鍵字和關(guān)鍵字的值生成一個(gè)字典供函數(shù)內(nèi)部使用
六、命名關(guān)鍵字參數(shù)/強(qiáng)制關(guān)鍵字參數(shù)
命名關(guān)鍵字參數(shù):強(qiáng)制關(guān)鍵字參數(shù)(Keyword-only arguments)是在3.1
版本之后引入的,指在函數(shù)定義時(shí),使用*
后綴來限制函數(shù)調(diào)用時(shí)必須使用關(guān)鍵字參數(shù)進(jìn)行傳遞,而不允許使用位置參數(shù)。
定義:例如只接收city和sex的參數(shù),其他,不接收。
def person(*, city, sex): # 使用分隔符“*”,表示后面的參數(shù)必須使用關(guān)鍵字傳遞 print(city, sex) person(city='USA',sex='男') # 輸出:USA 男
作用:限制要傳入的參數(shù)的名字,只能傳已命名關(guān)鍵字參數(shù)
。
特征:命名關(guān)鍵字參數(shù)需要一個(gè)特殊分隔符*
,而后面的參數(shù)被視為命名關(guān)鍵字參數(shù)。
def person(name, age, *, city, sex): print(name, age, city, sex) person('John',20,city='USA',sex='男') # 輸出:John 20 USA 男 #person('John',20,city='USA',birthday='1996-02-11') 報(bào)錯(cuò) TypeError: person() got an unexpected keyword argument 'birthday'
關(guān)鍵字參數(shù)和命名關(guān)鍵字參數(shù)的區(qū)別在于,前者可以傳遞任何名字的參數(shù),而后者只能傳遞*
后面名字的參數(shù)。如果函數(shù)定義中已經(jīng)有了一個(gè)可變參數(shù),后面跟著的命名關(guān)鍵字參數(shù)就不再需要一個(gè)特殊分隔符*
了:
def person(name, age, *args, city, sex): print(name, age,args, city, sex) person('John',20, *[1,2,3,4],city='USA',sex='男') #運(yùn)行結(jié)果: D:\App\python\python3.13.0\python.exe D:\WorkSpace-Python\Test\test.py John 20 (1, 2, 3, 4) USA 男
七、組合使用
定義:把以上五種參數(shù)組合在一起的參數(shù)組合
排放順序:在Python中定義函數(shù),可以用必選參數(shù)、默認(rèn)參數(shù)、可變參數(shù)、命名關(guān)鍵字參數(shù)和關(guān)鍵字參數(shù),這5種參數(shù)都可以組合使用。但是請(qǐng)注意,參數(shù)定義的順序必須是:必選參數(shù)–>默認(rèn)參數(shù)–>可變參數(shù)–>命名關(guān)鍵字參數(shù)–>關(guān)鍵字參數(shù)。
可讀性是代碼的一個(gè)很重要的要求,所以盡量避免使用多種參數(shù)的組合。
def person(name, age,clas='二班', *args, **kwargs): print('name:{}, age:{}, clas:{}, args:{}, kwargs:{}'.format(name, age,clas,args, kwargs)) person('John',20) #輸出:name:John, age:20, clas:二班, args:(), kwargs:{} person('John',20,'4班',1,2) #輸出:name:John, age:20, clas:4班, args:(1, 2), kwargs:{} person('John',20,'4班',1,2,city='USA',sex='男') #輸出:name:John, age:20, clas:4班, args:(1, 2), kwargs:{'city': 'USA', 'sex': '男'} def f1(a, b, c=0, *, d, **kw): print('a:{},b:{},c:{},d:{},kw:{}'.format(a,b,c,d,kw)) f1(1,2,d=4) # 輸出:a:1,b:2,c:0,d:4,kw:{} f1(1,2,3,d=4,e=5) #輸出:a:1,b:2,c:3,d:4,kw:{'e': 5}
總結(jié):
- 位置實(shí)參與關(guān)鍵字實(shí)參混合使用時(shí),位置實(shí)參必須放在關(guān)鍵字實(shí)參前面(語法規(guī)定)
- 位置形參與默認(rèn)形參混合使用時(shí),位置形參必須在默認(rèn)形參的左邊
*args
與**kwargs
混合使用時(shí),*args
必須寫在**kwargs
的前面,否則會(huì)報(bào)語法錯(cuò)誤
*
和**
的使用
*
和**
在函數(shù)定義處使用
*
:把多余的普通實(shí)參打包成元組**
:把多余的關(guān)鍵字實(shí)參打包成字典
*
和**
在函數(shù)調(diào)用處使用
*
:對(duì)元組或列表進(jìn)行解包**
:對(duì)字典進(jìn)行解包
*
和**
同時(shí)在函數(shù)定義處和調(diào)用處使用
- 先解包變成位置形參
- 再將多余的位置形參打包
# 示例一 def func(x, y, z): print(x, y, z) func(*[1, 2, 3]) func(*(1, 2, 3)) func(**{"x": 1, "y": 2, "z": 3}) # 實(shí)例二 def func(x, y, z, *args): print(x, y, z) print(args) func(5, 6, 7, *[1, 2, 3])
總結(jié)
到此這篇關(guān)于Python參數(shù)、參數(shù)類型、位置參數(shù)、默認(rèn)參數(shù)、可選參數(shù)的文章就介紹到這了,更多相關(guān)Python參數(shù)詳解內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
django遷移數(shù)據(jù)庫錯(cuò)誤問題解決
這篇文章主要介紹了django遷移數(shù)據(jù)庫錯(cuò)誤問題解決,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-07-07python深度學(xué)習(xí)tensorflow1.0參數(shù)初始化initializer
這篇文章主要為大家介紹了python深度學(xué)習(xí)tensorflow1.0參數(shù)初始化initializer示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06python字符串駐留機(jī)制的使用范圍知識(shí)點(diǎn)詳解
在本篇文章里小編給大家整理的是一篇關(guān)于python字符串駐留機(jī)制的使用范圍相關(guān)知識(shí)點(diǎn)內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。2021-09-09Python時(shí)間和日期庫的實(shí)現(xiàn)
這篇文章主要介紹了Python時(shí)間和日期庫的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03Pandas:Series和DataFrame刪除指定軸上數(shù)據(jù)的方法
今天小編就為大家分享一篇Pandas:Series和DataFrame刪除指定軸上數(shù)據(jù)的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-11-11Python的數(shù)據(jù)結(jié)構(gòu)與算法的隊(duì)列詳解(3)
這篇文章主要為大家詳細(xì)介紹了Python的隊(duì)列,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2022-03-03