Python函數(shù)參數(shù)分類使用與新特性詳細(xì)分析講解
函數(shù)參數(shù)看似很平常,在深究后發(fā)現(xiàn)其中還是有很多東西,參數(shù)分類、用法和新特性等,都可以體會到Python是真的靈活好用。
參數(shù)分類
一,定義與使用角度
形參:函數(shù)定義時定義的參數(shù)。
實(shí)參:函數(shù)調(diào)用時傳入的參數(shù)。
參數(shù)傳遞的過程,就是把實(shí)參的引用傳遞給形參,使用實(shí)參的值來執(zhí)行函數(shù)體的過程,形參的定義決定了實(shí)參傳入方式。
def print_num(num): print(num) a = 10 print_num(a) # 實(shí)參引用傳遞給 形參 num
二,傳參方式角度
Python 傳參方式有兩種:
按位置順序傳參:調(diào)用時根據(jù)參數(shù)位置順序傳遞,包括位置參數(shù)、默認(rèn)參數(shù)(缺省參數(shù))和可變參數(shù)
按關(guān)鍵字傳參:調(diào)用時以“關(guān)鍵字=值”形式傳遞參數(shù),包括關(guān)鍵字參數(shù)
1,位置參數(shù)
按照聲明時的位置順序關(guān)系依次傳遞參數(shù),形參與實(shí)參的數(shù)量、順序、數(shù)據(jù)類型必須對應(yīng),否則報(bào)錯。
def locationParams(m,n): print('第一個參數(shù)',m) print('第一個參數(shù)',n) locationParams(1,2)
2,默認(rèn)參數(shù)
定義函數(shù)時,為某個參數(shù)賦予一個默認(rèn)值,具有默認(rèn)值的參數(shù)稱為默認(rèn)參數(shù)
def defaultParams(m,n='xiaoming'): print('第一個參數(shù)',m) print('第一個參數(shù)',n) defaultParams('Hello','xiaoli') defaultParams('Hello') #未傳入默認(rèn)參數(shù) """ 第一個參數(shù) Hello 第二個參數(shù) xiaoli 第一個參數(shù) Hello 第二個參數(shù) xiaoming """
Tips:
(1)默認(rèn)參數(shù)不能在非默認(rèn)參數(shù)之前,Python 按照順序傳參,無法識別默認(rèn)參數(shù),聲明函數(shù)時,也會報(bào)錯:
SyntaxError: non-default argument follows default argument
def defaultParams(m='xiaoming',n): print('第一個參數(shù)',m) print('第二個參數(shù)',n) defaultParams('Hello') #Python 按照順序傳參,那么沒有實(shí)參會傳遞給形參n
(2)默認(rèn)參數(shù)不能時可變參數(shù),默認(rèn)參數(shù)的值時固定的,如果是可變參數(shù),則參數(shù)值會被修改。
def f(a,l=[]): l.append(a) return l print(f(1)) print(f(2)) print(f(3)) ## 默認(rèn)參數(shù)l為list,其對應(yīng)的值也被修改了 """ [1] [1, 2] [1, 2, 3] """
3,可變參數(shù)
可變參數(shù)是指參數(shù)個數(shù)是可以變化的,可以是0、1或多個,可變參數(shù)定義時符號“ * ” 表示。在函數(shù)調(diào)用時,可變參數(shù)接收的實(shí)參會被封裝成一個元組。
def variableParams(*params): print("參數(shù): ",params) sum = 0 for i in params: sum+=i print(sum) variableParams() # 不傳入?yún)?shù) variableParams(1,2,3,4) # 傳入多個參數(shù) num_list = [1,2,3,4] variableParams(*num_list) # num_list 加上“*” 將num_list拆解,否則num_list被當(dāng)成一個參數(shù)傳入 variableParams(num_list[0],num_list[1])
"""
參數(shù): () # 元組
0
參數(shù): (1, 2, 3, 4) # 元組
10
參數(shù): (1, 2, 3, 4) # 元組
10
參數(shù): (1, 2)
3
"""
4,關(guān)鍵字參數(shù)
關(guān)鍵字參數(shù)與可變參數(shù)類似,參數(shù)的個數(shù)都是可變的,所以也被稱作可變關(guān)鍵字參數(shù)。
關(guān)鍵字參數(shù)與可變參數(shù)區(qū)別
(1)關(guān)鍵字參數(shù)會被封裝成一個字典,可變參數(shù)接收的實(shí)參會被封裝成一個元組。
(2)函數(shù)調(diào)用時,關(guān)鍵字參數(shù)以以“關(guān)鍵字=值”形式傳遞參數(shù)
def keyWordParams(**params): print(params) keyWordParams() ## 不傳參數(shù) keyWordParams(name='xiaoming',age='11',gender='male') ## 關(guān)鍵字傳參 person_info = {'name': 'xiapli', 'age': '20', 'gender': 'male'} keyWordParams(**person_info) # **person_info 將字典拆分 """ {} {'name': 'xiaoming', 'age': '11', 'gender': 'male'} {'name': 'xiapli', 'age': '20', 'gender': 'male'} """
四類參數(shù)可以混合使用,但在聲明時,需要注意順序:位置參數(shù)、默認(rèn)參數(shù)、可變參數(shù)和關(guān)鍵字參數(shù)。否則Python將無法正常解析。
三,參數(shù)新特性
1,僅位置參數(shù)
Python3.8 新特性中,新增了僅位置參數(shù)。**新的函數(shù)參數(shù)語法 使用 “ / ” 指明有些函數(shù)參數(shù)必須被指定為位置參數(shù), 不能被用作關(guān)鍵字參數(shù)。 僅位置參數(shù) 在“ / ”之前,“ / ”之后可以是任意類型參數(shù) **
def pos_only(a,/): print(a) pos_only(1) # 1 pos_only(a=1) # TypeError: pos_only() got some positional-only arguments passed as keyword arguments: 'a'
2,僅關(guān)鍵字參數(shù)(命名關(guān)鍵字參數(shù))
與僅位置參數(shù),對應(yīng)的是僅關(guān)鍵字參數(shù),不過并非Python3.8 新特性,僅關(guān)鍵字參數(shù)也被稱為命名關(guān)鍵字參數(shù)。聲明函數(shù)時,在第一個關(guān)鍵字形參前添加“ * ”,表明必須以關(guān)鍵字參數(shù)形式傳參。
def stu_info(name,gender,*,age,city): print('name is:',name,' gender is:',gender,' age:',age,' city:',city) stu_info('Bob','M',age=7,city='TJ') stu_info('Lucy','F',city='BJ',age=10)
關(guān)鍵字參數(shù)和命名關(guān)鍵字參數(shù)的區(qū)別在于,前者可以傳遞任何名字的參數(shù),而后者只能傳遞 后面名字的參數(shù)。
stu_info('Lucy','F',city='BJ',addr=10) # stu_info() got an unexpected keyword argument 'addr'
如果函數(shù)定義中已經(jīng)有了一個可變參數(shù),后面跟著的命名關(guān)鍵字參數(shù)就不再需要一個“ * ”了
#args可以傳遞一個tuple 其后只能傳遞age和city參數(shù) def stu_info(name,gender,*args,age,city): print('name is:',name,' gender is:',gender,' age:',age,' city:',city) for i in args: print('args:',i) stu_info('Bob','M',age=7,city='TJ') stu_info('Lucy','F',(2,3),city='BJ',age=10) """ name is: Bob gender is: M age: 7 city: TJ name is: Lucy gender is: F age: 10 city: BJ args: (2, 3) """
最后幾個題目,大家可以測試下是否掌握:
def function1(a, b, c=0, *arg, **kw): print('a =', a, 'b =', b, 'c =', c, 'arg=',arg, 'kw =', kw) function1(1,2,3,4,5,A=1,B=2) # a = 1 b = 2 c = 3 arg= (4, 5) kw = {'A': 1, 'B': 2} def function2(a,/, b, c=0, *arg, **kw): print('a =', a, 'b =', b, 'c =', c, 'arg=',arg, 'kw =', kw) function2(1,2,3,4,5,A=1,B=2) # a = 1 b = 2 c = 3 arg= (4, 5) kw = {'A': 1, 'B': 2} def function3(a, b, c=0, *, d, **kw): print('a =', a, 'b =', b, 'c =', c, 'd =', d, 'kw =', kw) function3(1,2,3,d=4,A=1,B=2) # a = 1 b = 2 c = 3 d = 4 kw = {'A': 1, 'B': 2} def function4(a, b, c=0, *arg, d, **kw): print('a =', a, 'b =', b, 'c =', c, 'arg=',arg, 'd =', d, 'kw =', kw) function4(1,2,3,4,5,d=6,A=1,B=2) # a = 1 b = 2 c = 3 arg= (4, 5) d = 6 kw = {'A': 1, 'B': 2}
到此這篇關(guān)于Python函數(shù)參數(shù)分類使用與新特性詳細(xì)分析講解的文章就介紹到這了,更多相關(guān)Python函數(shù)參數(shù)分類內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
在Tensorflow中實(shí)現(xiàn)leakyRelu操作詳解(高效)
這篇文章主要介紹了在Tensorflow中實(shí)現(xiàn)leakyRelu操作詳解(高效),具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-06-06Python網(wǎng)絡(luò)請求模塊urllib與requests使用介紹
網(wǎng)絡(luò)爬蟲的第一步就是根據(jù)URL,獲取網(wǎng)頁的HTML信息。在Python3中,可以使用urllib和requests進(jìn)行網(wǎng)頁數(shù)據(jù)獲取,這篇文章主要介紹了Python網(wǎng)絡(luò)請求模塊urllib與requests使用2022-10-10詳解java調(diào)用python的幾種用法(看這篇就夠了)
這篇文章主要介紹了詳解java調(diào)用python的幾種用法(看這篇就夠了),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12Django-xadmin后臺導(dǎo)入json數(shù)據(jù)及后臺顯示信息圖標(biāo)和主題更改方式
這篇文章主要介紹了Django-xadmin后臺導(dǎo)入json數(shù)據(jù)及后臺顯示信息圖標(biāo)和主題更改方式,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-03-03Python實(shí)現(xiàn)OpenCV的安裝與使用示例
這篇文章主要介紹了Python實(shí)現(xiàn)OpenCV的安裝與使用,結(jié)合實(shí)例形式分析了Python中OpenCV的安裝及針對圖片的相關(guān)操作技巧,需要的朋友可以參考下2018-03-03