成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

python中關(guān)于閉包用法詳解

89542767 / 384人閱讀

  小編寫這篇文章的主要目的,主要是來給大家介紹,關(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))()
  """

0.png

  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

相關(guān)文章

  • JavaScript深入淺出

    摘要:理解的函數(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 的值到底...

    blair 評(píng)論0 收藏0
  • 工具使用-積累與發(fā)現(xiàn)

    摘要:一積累中如何快速查看包中的源碼最常用的大開發(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ì)象保存到...

    wangjuntytl 評(píng)論0 收藏0
  • 工具使用-積累與發(fā)現(xiàn)

    摘要:一積累中如何快速查看包中的源碼最常用的大開發(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ì)象保存到...

    Lyux 評(píng)論0 收藏0
  • javascript中關(guān)作用域和閉包

    摘要:在代碼執(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è)問題,以便在今后的...

    zacklee 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<