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ì)象語(yǔ)法上沒錯(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í)參前面(語(yǔ)法規(guī)定)
- 位置形參與默認(rèn)形參混合使用時(shí),位置形參必須在默認(rèn)形參的左邊
*args與**kwargs混合使用時(shí),*args必須寫在**kwargs的前面,否則會(huì)報(bào)語(yǔ)法錯(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ù)庫(kù)錯(cuò)誤問題解決
這篇文章主要介紹了django遷移數(shù)據(jù)庫(kù)錯(cuò)誤問題解決,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-07-07
python深度學(xué)習(xí)tensorflow1.0參數(shù)初始化initializer
這篇文章主要為大家介紹了python深度學(xué)習(xí)tensorflow1.0參數(shù)初始化initializer示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06
python字符串駐留機(jī)制的使用范圍知識(shí)點(diǎn)詳解
在本篇文章里小編給大家整理的是一篇關(guān)于python字符串駐留機(jī)制的使用范圍相關(guān)知識(shí)點(diǎn)內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。2021-09-09
Python時(shí)間和日期庫(kù)的實(shí)現(xiàn)
這篇文章主要介紹了Python時(shí)間和日期庫(kù)的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03
Pandas:Series和DataFrame刪除指定軸上數(shù)據(jù)的方法
今天小編就為大家分享一篇Pandas:Series和DataFrame刪除指定軸上數(shù)據(jù)的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-11-11
Python的數(shù)據(jù)結(jié)構(gòu)與算法的隊(duì)列詳解(3)
這篇文章主要為大家詳細(xì)介紹了Python的隊(duì)列,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2022-03-03

