小編寫這篇文章的主要目的,主要是來給大家介紹,關(guān)于python中,相關(guān)語法問題的解答,比如在python,我們會(huì)遇到閉包和裝飾器不會(huì)用的情況,那么,下文就會(huì)來給大家做一個(gè)詳細(xì)的解答。
*args與**kwarsg及閉包和裝飾器
過程
先理解閉包,再理解裝飾器,不要忘了不定長(zhǎng)參數(shù)
deffunc(): msg='111' deffunc1(): print(msg) returnfunc1 """
1-理解閉包 閉包即內(nèi)部函數(shù)調(diào)用外部函數(shù)作用域里面的變量 比如func1就是一個(gè)閉包函數(shù) """ func()()#這里實(shí)際上是func1() """ 2-裝飾器 fn是被裝飾的目標(biāo)函數(shù) 2.1-僅僅只是傳遞函數(shù)名的裝飾器[基本不會(huì)用到] 2.2-裝飾帶有參數(shù)的函數(shù) 2.3-裝飾帶有返回值的函數(shù) 2.4-裝飾參數(shù)不確定的函數(shù)[可歸類到裝飾帶有參數(shù)的函數(shù)里面] 2.5-裝飾器本身攜帶參數(shù) """
defdecorator(fn): defwrapper(): print("添加的功能,裝飾不帶有參數(shù)的函數(shù)") returnfn() returnwrapper @decorator deftest(): print("原有功能") test()#實(shí)際上是decorator(test) defdecorator1(fn): defwrapper(n1,n2): print("添加的功能,裝飾帶有參數(shù)的函數(shù)") returnfn(n1,n2) returnwrapper @decorator1 deftest1(a,b): print("a+b=%s"%(a+b)) print("原有功能") test1(1,2)#實(shí)際上是decorator1(test1(1,2)) defdecoretor2(fn): defwrapper(): print("添加的功能,裝飾帶有返回值的函數(shù)") res=fn() returnres returnwrapper @decoretor2 deftest2(): print("原有功能") return"返回值001" a=test2()#實(shí)際是decorator2(test2) print(a) defdecorator3(fn): defwarpper(*args,**kwargs): print("添加的功能,裝飾不定長(zhǎng)參數(shù)的函數(shù)") returnfn(*args,**kwargs) returnwarpper @decorator3 deftest3(n1,n2,n3): print("原有功能") print(n1+n2+n3) test3(1,2,3)#實(shí)際上是decorator1(test1(1,2,3)) defdecorator4(home): deffunc_1(fn): defwrapper(*args,**kwargs): print("裝飾器本身攜帶參數(shù)") print("目前家在%s"%(home)) returnfn(*args,**kwargs) returnwrapper returnfunc_1 @decorator4(home='wuhan') deftest4(n1,n2,n3): print("原有功能") print(n1+n2+n3) #test3(1,2,3)=decorator3(home="武漢")(test(1,2,3))() """
1-先調(diào)用decorator3(home="wuhan")
2-執(zhí)行func_1(test(1,2,3))#到這里其實(shí)就和前面的裝飾器一樣
3-執(zhí)行wrapper
4-執(zhí)行test(1,2,3)
"""
test4(1,2,3)
Pythonfun(*args,**kwargs)中*args,**kwargs參數(shù)含義及用法
1.Python函數(shù)中的兩種參數(shù)
我們知道,在Python中有兩種參數(shù)
位置參數(shù)(positionalargument):位置參數(shù)只能由參數(shù)位置決定
關(guān)鍵詞參數(shù)(keywordargument):關(guān)鍵詞參數(shù)只需要用keyword=somekey的方法即可傳參
位置參數(shù)只能由參數(shù)位置決定。這也就決定了位置參數(shù)一定要在前面,否則關(guān)鍵詞參數(shù)數(shù)量的變化都會(huì)使得位置無法判斷。
2.理解函數(shù)調(diào)用中的*
*的作用是將tuple或者list中的元素進(jìn)行unpack,分開傳入,作為多個(gè)參數(shù)。
deffunc(a,b,c) print(a,b,c) alist=[1,2,3]#這里alist的長(zhǎng)度必須和函數(shù)中參數(shù)的個(gè)數(shù)相同,否則會(huì)報(bào)錯(cuò) func(*alist) #等同于func(1,2,3) 123
2.1*做了什么
它拆開數(shù)列alist的數(shù)值作為位置參數(shù),并把這些位置參數(shù)傳給函數(shù)func來調(diào)用。
因此拆數(shù)列、傳位置參數(shù)意味著func(*alist)與func(1,2,3)是等效的,因?yàn)閍list=[1,2,3]。
3.理解函數(shù)調(diào)用中的**
**的作用是unpack字典,并將字典中的數(shù)據(jù)項(xiàng)作為鍵值參數(shù)傳給函數(shù)。
為了更好的理解舉幾個(gè)例子:
deffunc(a,b,c): print(a,b,c) if__name__=="__main__": dic={'b':2,'c':3} func(1,b=2,c=3) func(1,**dic) 123 123
4.理解函數(shù)調(diào)用中的*args和**kwargs
kwargs是keywordargument的縮寫,args就是argument。常見的是*args在**kwargs前面。
這兩個(gè)的用途和效果如下:
defthis_fun(a,b,*args,**kwargs): """ 在這個(gè)函數(shù)定義中,參數(shù)”a,b”代表”常規(guī)參數(shù)列表”。 args接收元組作為位置參數(shù),而非是常見的參數(shù)列表 """ print(a,b) print(args) print(kwargs) if__name__='__main__' this_fun(0,1,2,3,index1=11,index2=22) 0,1 (2,3) {'index2':22,'index1':11}
也就是說,第一中不定的參數(shù)形式把剩下的沒有關(guān)鍵字的參數(shù)收起來形成一個(gè)tuple,而第二種把有關(guān)鍵字的收起來做成一個(gè)字典。
5.實(shí)例說明args,kwargs的應(yīng)用場(chǎng)景
5.1子類傳參給父類方法
在任何時(shí)候繼承類和重寫方法的,我們應(yīng)當(dāng)用到args,kwargs將接收到的位置參數(shù)和鍵值參數(shù)給父類方法。通過實(shí)例我們更好的理解
classModel(object): def__init__(self,name): self.name=name defsave(self,force_update=False,force_insert=False): ifforce_updateandforce_insert: raiseValueError("Cannotperformbothoperations") ifforce_update: print("Updatedanexistingrecord") ifforce_insert: print("Createdanewrecord")
定義一個(gè)類,我們可以創(chuàng)建類的對(duì)象,類的對(duì)象有一個(gè)方法save().假設(shè)類的對(duì)象可以通過save()方法保存到數(shù)據(jù)庫中。通過函數(shù)save()參數(shù)來決定是否在數(shù)據(jù)庫中創(chuàng)建一條記錄或者更新現(xiàn)存的記錄。
構(gòu)造一個(gè)新類,類有Model的行為,但只有符合某些條件才會(huì)保存這個(gè)類的對(duì)象。這個(gè)新類繼承Model,重寫Model的save()
classChildModel(Model): defsave(self,*args,**kwargs): ifself.name=='abcd': super(ChildModel,self).save(*args,**kwargs) else: returnNone
實(shí)際上對(duì)應(yīng)的保存動(dòng)作發(fā)生在’Model’的save方法中。所以我們調(diào)用子類的的save()方法而非’Model’的方法.子類ChildModel的save()接收任何父類save()需要的參數(shù),并傳給父類方法。因此,子類save()方法參數(shù)列表中有*args和**kwargs,它們可以接收任意位置參數(shù)或鍵值參數(shù),常規(guī)參數(shù)列表除外。
下面創(chuàng)建ChildModel實(shí)體并調(diào)用save方法:
c=ChildModel('abcd') c.save(force_insert=True) c.save(force_update=True) #結(jié)果 Createdanewrecord Updatedanexistingrecord
這里傳參數(shù)給對(duì)象的save()方法。調(diào)用的是子類的save(),它接收一個(gè)包含關(guān)鍵字參數(shù)kwargs的字典。然后,它使用**將字典作為關(guān)鍵字參數(shù)unpack,然后將其傳遞給超類save()。因此,超類save()獲得關(guān)鍵字參數(shù)force_insert并執(zhí)行相應(yīng)的操作。
5.2*args實(shí)現(xiàn)sum
defmy_sum(*args): res=0 forvalinargs: res+=val returnres l1=[4,8] l2=[1,2,3] print(my_sum(*l1)) #12 print(my_sum(*l2)) #6 print(my_sum(4,5,6)) #15
綜上所述,就為大家介紹到這里了,希望可以為大家?guī)韼椭?br/>
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/127833.html
摘要:理解的函數(shù)基礎(chǔ)要搞好深入淺出原型使用原型模型,雖然這經(jīng)常被當(dāng)作缺點(diǎn)提及,但是只要善于運(yùn)用,其實(shí)基于原型的繼承模型比傳統(tǒng)的類繼承還要強(qiáng)大。中文指南基本操作指南二繼續(xù)熟悉的幾對(duì)方法,包括,,。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處。 怎樣使用 this 因?yàn)楸救藢儆趥吻岸?,因此文中只看懂?8 成左右,希望能夠給大家?guī)韼椭?...(據(jù)說是阿里的前端妹子寫的) this 的值到底...
摘要:一積累中如何快速查看包中的源碼最常用的大開發(fā)快捷鍵技巧將對(duì)象保存到文件中從文件中讀取對(duì)象中的用法的配置詳解和代碼的格式詳解格式化內(nèi)容設(shè)置生成詳解注釋規(guī)范中設(shè)置內(nèi)存調(diào)試的小知識(shí)單步執(zhí)行命令的區(qū)別的動(dòng)態(tài)代理機(jī)制詳解內(nèi)容有瑕疵,樓指正泛型繼承的幾 一、積累 1.JAVA Eclipse中如何快速查看jar包中 的class源碼 最常用的15大Eclipse開發(fā)快捷鍵技巧 Java將對(duì)象保存到...
摘要:一積累中如何快速查看包中的源碼最常用的大開發(fā)快捷鍵技巧將對(duì)象保存到文件中從文件中讀取對(duì)象中的用法的配置詳解和代碼的格式詳解格式化內(nèi)容設(shè)置生成詳解注釋規(guī)范中設(shè)置內(nèi)存調(diào)試的小知識(shí)單步執(zhí)行命令的區(qū)別的動(dòng)態(tài)代理機(jī)制詳解內(nèi)容有瑕疵,樓指正泛型繼承的幾 一、積累 1.JAVA Eclipse中如何快速查看jar包中 的class源碼 最常用的15大Eclipse開發(fā)快捷鍵技巧 Java將對(duì)象保存到...
摘要:在代碼執(zhí)行時(shí),對(duì)應(yīng)的作用域鏈常常是保持靜態(tài)的。當(dāng)語句執(zhí)行完畢后,會(huì)把作用域鏈恢復(fù)到原始狀態(tài)。在全局作用域中創(chuàng)建的函數(shù),其作用域鏈會(huì)自動(dòng)成為全局作用域中的一員。 列表項(xiàng)目 前言 學(xué)習(xí)了javascript已經(jīng)很久了,關(guān)于這個(gè)語言中的這兩個(gè)特性也是早已耳熟能詳,但是在實(shí)際的使用的過程中或者是遇到相關(guān)的問題的時(shí)候,還是不能很好的解決。因此我覺得很有必要深入的學(xué)習(xí)并且記錄這個(gè)問題,以便在今后的...
閱讀 923·2023-01-14 11:38
閱讀 895·2023-01-14 11:04
閱讀 756·2023-01-14 10:48
閱讀 2055·2023-01-14 10:34
閱讀 961·2023-01-14 10:24
閱讀 840·2023-01-14 10:18
閱讀 510·2023-01-14 10:09
閱讀 588·2023-01-14 10:02