Python參數(shù)、參數(shù)類型、位置參數(shù)、默認參數(shù)、可選參數(shù)舉例詳解
以下內(nèi)容基于Python3.13進行講解,對于Python3.x來說下面的內(nèi)容都是支持的。
參數(shù)類型:
1、位置參數(shù)(Positional Arguments),必填參數(shù)
2、默認值參數(shù)(Default Arguments),非必傳
3、可變參數(shù),非必傳,不限制參數(shù)個數(shù),比如說給多個人發(fā)郵件,發(fā)郵件的人數(shù)不確定
4、關鍵字參數(shù)(Keyword Arguments),非必傳,不限制參數(shù)個數(shù),會把傳過來的關鍵字參數(shù),放到一個字典里面,傳參的時候必須得用k=v這樣子來傳
5、命名關鍵字參數(shù)/強制關鍵字參數(shù)(Keyword-Only Arguments)

一、位置參數(shù)
也叫必傳參數(shù),順序參數(shù),是最重要的,也是必須在調(diào)用函數(shù)時明確提供的參數(shù)!位置參數(shù)必須按先后順序,一一對應,個數(shù)不多不少的傳遞!
定義:就是在給函數(shù)傳參數(shù)時,按照順序,依次傳值。
def add(a,b):
print('a:{}, b:{}'.format(a,b))
print(add(1,2))
#運行結(jié)果:
D:\App\python\python3.13.0\python.exe D:\WorkSpace-Python\Test\test.py
a:1, b:2
在這個例子中,a和 b就是位置參數(shù),而且兩個值必傳,否則會報錯。
二、默認參數(shù)(Default Arguments)
默認參數(shù)允許我們在函數(shù)定義時為參數(shù)指定默認值。如果調(diào)用函數(shù)時不傳遞該參數(shù),將使用默認值。
def test(name,message='Boy'):
print('name:{}, message:{}'.format(name,message))
test('Tom') #若不傳默認參數(shù),則使用默認值
test('Alice','Girl') # 輸出:name:Alice, message:Girl
test('Alice',message = 'Girl') # 輸出:name:Alice, message:Girl
#運行結(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
默認參數(shù)使用注意事項a. 默認參數(shù)必須在位置參數(shù)后面,這樣才能被解釋器正確識別,否則會產(chǎn)生二義性。
def test(message='Boy',name): # SyntaxError: parameter without a default follows parameter with a default
print('name:{}, message:{}'.format(name,message))

b. 默認參數(shù)一定要指向不變對象!
def defaultzero(arr = []): #我們的本意是提供的arr參數(shù)為0時 返回只有一個0的arr
arr.append(0)
return arr
print(defaultzero()) #輸出:[0]
print(defaultzero()) #輸出:[0, 0] 顯然重復調(diào)用的時候結(jié)果不是我們所期望的
#解決方案 使用None
def defaultzero1(arr = None):
if arr == None:
arr = []
arr.append(0)
return arr
print(defaultzero1()) #輸出:[0]
print(defaultzero1()) #輸出:[0] 重復調(diào)用的時候,也輸出相同
#這說明arr是一個對象
#事實上Python所有的數(shù)據(jù)類型其實都是對象
說明:上面的答案可能與你想的不一樣,為什么呢?應為在定義默認函數(shù)時,arr 為一個可變變量,在函數(shù)體被讀入內(nèi)存的時候,默認參數(shù)arr指向的空列表對象就會被創(chuàng)建,arr的內(nèi)存地址不變,每次調(diào)用函數(shù)都像arr變量中添加0
結(jié)果說明python解釋器會將默認參數(shù)作為一個公共對象來對待,多次調(diào)用含有默認參數(shù)的函數(shù),就會進行多次修改。
因此定義默認參數(shù)時一定要使用不可變對象(int、float、str、tuple)。使用可變對象語法上沒錯,但在邏輯上是不安全的,代碼量非常大時,容易產(chǎn)生很難查找的bug。
三、關鍵字參數(shù)
關鍵字參數(shù)(Keyword Arguments)是一種在函數(shù)調(diào)用時使用參數(shù)名稱來指定參數(shù)值的方式,不必按照定義形參的順序傳遞參數(shù)。
def person(name, age):
print('name:{}, age:{}'.format(name, age))
# 使用關鍵字參數(shù)調(diào)用函數(shù)
person(name='張三',age=20) #輸出:name:張三, age:20
person(age=31,name='李四') #輸出:name:李四, age:31
使用關鍵字參數(shù)調(diào)用函數(shù)對參數(shù)順序沒有要求。
既有位置參數(shù)又有關鍵字參數(shù),位置參數(shù)必須放到關鍵字參數(shù)前面否則報錯

四、可變位置參數(shù)
可變位置參數(shù):Python函數(shù)提供了可變參數(shù),來方便進行參數(shù)個數(shù)未知時的調(diào)用。可變參數(shù)將以tuple 元組形式傳遞。
定義:可變參數(shù)就是傳入的參數(shù)個數(shù)是可變的,可以是0個,1個,2個,……很多個。作用:就是可以一次給函數(shù)傳很多的參數(shù)特征(格式):
*args【*參數(shù) (即在參數(shù)前加*號)】
def add(a,b):
return a,b
#上述函數(shù)若傳入多個參數(shù)則需要定義多個變量,可以簡化為可變參數(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這個list中所有元素作為可變參數(shù)傳進去
print(add1(*listArray)) #輸出結(jié)果:6
#運行結(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形式傳遞關于*星號的用法可以參考另一篇博文:《python中的*與**用法詳解》
五、可變關鍵字參數(shù)
關鍵字參數(shù):非必傳。Python的可變位置參數(shù)以tuple形式傳遞,而關鍵字參數(shù)則是以dict形式傳遞。 即可變參數(shù)傳遞的是參數(shù)值,關鍵字參數(shù)傳遞的是參數(shù)名:參數(shù)值鍵值對。
定義:關鍵字參數(shù)允許你傳入0個或任意個含參數(shù)名的參數(shù),這些關鍵字參數(shù)在函數(shù)內(nèi)部自動組裝為一個dict。在調(diào)用函數(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這個dict的所有key-value用關鍵字參數(shù)傳入到函數(shù)的**kwargs參數(shù),kwargs將獲得一個dict。注意kwargs獲得的dict是dictArray的一份拷貝,對kwargs的改動不會影響到函數(shù)外的dictArray。
#運行結(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ù)必須是最后一個**修飾的參數(shù)必須以關鍵字的參數(shù)方式傳參,Python解釋器會將傳入的關鍵字和關鍵字的值生成一個字典供函數(shù)內(nèi)部使用
六、命名關鍵字參數(shù)/強制關鍵字參數(shù)
命名關鍵字參數(shù):強制關鍵字參數(shù)(Keyword-only arguments)是在3.1版本之后引入的,指在函數(shù)定義時,使用*后綴來限制函數(shù)調(diào)用時必須使用關鍵字參數(shù)進行傳遞,而不允許使用位置參數(shù)。
定義:例如只接收city和sex的參數(shù),其他,不接收。
def person(*, city, sex): # 使用分隔符“*”,表示后面的參數(shù)必須使用關鍵字傳遞 print(city, sex) person(city='USA',sex='男') # 輸出:USA 男
作用:限制要傳入的參數(shù)的名字,只能傳已命名關鍵字參數(shù)。
特征:命名關鍵字參數(shù)需要一個特殊分隔符*,而后面的參數(shù)被視為命名關鍵字參數(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') 報錯 TypeError: person() got an unexpected keyword argument 'birthday'
關鍵字參數(shù)和命名關鍵字參數(shù)的區(qū)別在于,前者可以傳遞任何名字的參數(shù),而后者只能傳遞*后面名字的參數(shù)。如果函數(shù)定義中已經(jīng)有了一個可變參數(shù),后面跟著的命名關鍵字參數(shù)就不再需要一個特殊分隔符*了:
def person(name, age, *args, city, sex):
print(name, age,args, city, sex)
person('John',20, *[1,2,3,4],city='USA',sex='男')
#運行結(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ù)、默認參數(shù)、可變參數(shù)、命名關鍵字參數(shù)和關鍵字參數(shù),這5種參數(shù)都可以組合使用。但是請注意,參數(shù)定義的順序必須是:必選參數(shù)–>默認參數(shù)–>可變參數(shù)–>命名關鍵字參數(shù)–>關鍵字參數(shù)。
可讀性是代碼的一個很重要的要求,所以盡量避免使用多種參數(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é):
- 位置實參與關鍵字實參混合使用時,位置實參必須放在關鍵字實參前面(語法規(guī)定)
- 位置形參與默認形參混合使用時,位置形參必須在默認形參的左邊
*args與**kwargs混合使用時,*args必須寫在**kwargs的前面,否則會報語法錯誤
*和**的使用
*和**在函數(shù)定義處使用
*:把多余的普通實參打包成元組**:把多余的關鍵字實參打包成字典
*和**在函數(shù)調(diào)用處使用
*:對元組或列表進行解包**:對字典進行解包
*和**同時在函數(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})
# 實例二
def func(x, y, z, *args):
print(x, y, z)
print(args)
func(5, 6, 7, *[1, 2, 3])
總結(jié)
到此這篇關于Python參數(shù)、參數(shù)類型、位置參數(shù)、默認參數(shù)、可選參數(shù)的文章就介紹到這了,更多相關Python參數(shù)詳解內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
python深度學習tensorflow1.0參數(shù)初始化initializer
這篇文章主要為大家介紹了python深度學習tensorflow1.0參數(shù)初始化initializer示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-06-06
Pandas:Series和DataFrame刪除指定軸上數(shù)據(jù)的方法
今天小編就為大家分享一篇Pandas:Series和DataFrame刪除指定軸上數(shù)據(jù)的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-11-11
Python的數(shù)據(jù)結(jié)構(gòu)與算法的隊列詳解(3)
這篇文章主要為大家詳細介紹了Python的隊列,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2022-03-03

