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

資訊專欄INFORMATION COLUMN

python中的生成器、迭代器、裝飾器分別是什么意思呢?

89542767 / 478人閱讀

  python中的生成器、迭代器、裝飾器分別是什么意思呢?具體的含義,一些其具體的用途,下面小編就給大家詳細(xì)的解答下。


  一、裝飾器


  由于一個(gè)函數(shù)能實(shí)現(xiàn)一種功能,現(xiàn)在想要在不改變其代碼的情況下,讓這個(gè)函數(shù)進(jìn)化一下,即能保持原來(lái)的功能,還能有新的"技能",怎么辦?


  現(xiàn)已經(jīng)存在一個(gè)自定義的函數(shù)func1


  def func1():
  print('hello,world!')


  讓func1進(jìn)化一下:(繼承func1之前的所有功能,而且還有新的‘技能’)


  效果和下面定義的函數(shù)func2效果是一樣的


  def func2():
  func1()#調(diào)用func1,即可保持func1這一函數(shù)的所有的功能都被這個(gè)新的函數(shù)繼承下來(lái)
  print('hello,boy!')#添加的新功能,相當(dāng)于func1這一函數(shù)學(xué)到的新技能


  但是,func2是一個(gè)新的函數(shù),已經(jīng)完全改頭換面了,雖然有一部分是能實(shí)現(xiàn)func1的功能,但并不是func1的進(jìn)化型,所以當(dāng)我們還想用調(diào)用func1這個(gè)函數(shù)的調(diào)用方法調(diào)用的時(shí)候,并不能調(diào)用func2.


  當(dāng)函數(shù)不進(jìn)行調(diào)用時(shí)候,可以將這個(gè)函數(shù)當(dāng)成一個(gè)變量進(jìn)行對(duì)待。所以,如果把func2這個(gè)函數(shù)的內(nèi)存地址賦給func1,然后調(diào)用func1,那么就能用func1這個(gè)名字,調(diào)用func2這個(gè)函數(shù),也就實(shí)現(xiàn)了func1這個(gè)函數(shù)的進(jìn)化。


  所以,如果定義如下一個(gè)可以實(shí)現(xiàn)上述功能的函數(shù)deco,deco這個(gè)函數(shù)就要完成以下的兩件事情:


  1.讓func2這個(gè)函數(shù)的內(nèi)存地址出現(xiàn),即:定義func2這個(gè)函數(shù)


  2.在其執(zhí)行之后能夠,拿到func2的內(nèi)存地址,即把func2的內(nèi)存地址作為返回值返回


  def deco(func1):
  def func2():
  func1()#調(diào)用func1,即可保持func1這一函數(shù)的所有的功能都被這個(gè)新的函數(shù)繼承下來(lái)
  print('hello,boy!')#添加的新功能,相當(dāng)于func1這一函數(shù)學(xué)到的新技能
  return func2


  完成上述deco函數(shù)的定義之后,當(dāng)執(zhí)行deco這個(gè)函數(shù)之后,其執(zhí)行結(jié)果,就是func2的內(nèi)存地址。


  接下來(lái),將這個(gè)內(nèi)存地址賦值給func1這個(gè)變量之后,再對(duì)func1進(jìn)行調(diào)用,就可以完成對(duì)函數(shù)func1的"進(jìn)化"(即:在不改變func1的代碼,還賦予了其新的功能)


  func1=deco(func1)
  func1()


  上述的過(guò)程可以用以下的代碼進(jìn)行實(shí)現(xiàn):


  def deco(func1):
  def func2():
  func1()#調(diào)用func1,即可保持func1這一函數(shù)的所有的功能都被這個(gè)新的函數(shù)繼承下來(lái)
  print('hello,boy!')#添加的新功能,相當(dāng)于func1這一函數(shù)學(xué)到的新技能
  return func2
  def func1():
  print('hello,world!')
  func1=deco(func1)
  func1()
  其中,deco這個(gè)函數(shù)就是所謂的裝飾器
  (裝飾器:在不改變?cè)创a和調(diào)用方式的基礎(chǔ)之上給函數(shù)增加新的功能)
  將上述代碼進(jìn)行優(yōu)化之后就有了下面的代碼:
  def deco(func1):
  def func2():
  func1()#調(diào)用func1,即可保持func1這一函數(shù)的所有的功能都被這個(gè)新的函數(shù)繼承下來(lái)
  print('hello,boy!')#添加的新功能,相當(dāng)于func1這一函數(shù)學(xué)到的新技能
  return func2
  deco#效果等同于func1=deco(func1)
  def func1():
  print('hello,world!')
  func1()
  1.1含參數(shù)的裝飾器:
  def deco(func):
  def wrapper(username,password):
  if username=='root'and password=='root':
  func(username,password)else:
  print('用戶名或密碼錯(cuò)誤')
  return wrapper
  deco
  def baidu_index(username,password):
  print('welcome to百度')
  baidu_index('root','root')


  由于定義的函數(shù)baidu_index,必須要傳遞參數(shù),所以裝飾器內(nèi)部定義的函數(shù)wrapper也需要定義形參,wrapper函數(shù)內(nèi)部調(diào)用函數(shù)時(shí),也需要有參數(shù)!!


  1.2多層裝飾器


  將裝飾器1看成一個(gè)整體,在這個(gè)裝飾器上在添加一個(gè)裝飾器2,就能實(shí)現(xiàn)..........


  例如:


  def deco1(deco):
  print('你好不好?')
  def deco(func):
  def func2():
  print('你不好!')
  func()
  return func2
  return deco
  deco1
  def deco(func):
  def func2():
  print('你不好!')
  func()
  return func2
  deco
  def func1():
  print('你好!')
  func1()

  二、迭代器:


  1.什么是迭代?


  1.迭代是一個(gè)重復(fù)的過(guò)程,即每一次重復(fù)為一次迭代,


  2.并且每次迭代的結(jié)果都是下一次迭代的初始值


  例如:


  l=[1,2,3]
  count=0
  while count<len(l):#首先是重復(fù)動(dòng)作,其次上一次的結(jié)果是下一次的初始值,因此,是迭代
  print(l[count])
  count+=1


  2.什么是迭代器?為何要有迭代器?


  自媒體培訓(xùn)


  對(duì)于序列類型:字符串、列表、元組,我們可以使用索引的方式迭代取出其包含的元素。但對(duì)于字典、集合、文件等類型是沒(méi)有索引的,若還想取出其內(nèi)部包含的元素,則必須找出一種不依賴于索引的迭代方式,這就是迭代器。


  3.什么叫做迭代器對(duì)象?


  obj有.__iter__和.__next__方法的叫做迭代器對(duì)象


  總結(jié):迭代器對(duì)象一定是可迭代對(duì)象,而可迭代對(duì)象不一定是迭代器對(duì)象


  4.for的作用:


  1.把可迭代對(duì)象變成迭代器對(duì)象


  2.過(guò)濾錯(cuò)誤信息


  l1=[1,2,3]
  for i in l1:#iter(l1)
  print(i)


  三、生成器


  1.什么是生成器?


  只要函數(shù)里有yield關(guān)鍵字,那么函數(shù)名()得到的結(jié)果就是生成器,生成器就是迭代器,并且不會(huì)執(zhí)行函數(shù)內(nèi)部代碼


  2.return和yield用法十分類似,但是也有區(qū)別,區(qū)別在于:return只能返回一個(gè)值,而yield可以返回多個(gè)值


  3.生成器優(yōu)點(diǎn):


  同一時(shí)間只存儲(chǔ)一個(gè)值,節(jié)省內(nèi)存空間


  4.生成器的缺點(diǎn):


  只能向后取值,不能往前取值


  def test():
  for i in range(100):
  yield i
  res=test()
  for k in res:
  print(k)


  四、總結(jié)


  迭代器


  迭代是Python最強(qiáng)大的功能之一,是訪問(wèn)集合元素的一種方式;迭代器是一個(gè)可以記住遍歷的位置的對(duì)象;迭代器對(duì)象從集合的第一個(gè)元素開(kāi)始訪問(wèn),直到所有的元素被訪問(wèn)完結(jié)束。迭代器只能往前不會(huì)后退;迭代器有兩個(gè)基本的方法:iter()和next();字符串,列表或元組對(duì)象都可用于創(chuàng)建迭代器:

01.png

  生成器


  在Python中,使用了yield的函數(shù)被稱為生成器;跟普通函數(shù)不同的是,生成器是一個(gè)返回迭代器的函數(shù),只能用于迭代操作,更簡(jiǎn)單點(diǎn)理解生成器就是一個(gè)迭代器;在調(diào)用生成器運(yùn)行的過(guò)程中,每次遇到y(tǒng)ield時(shí)函數(shù)會(huì)暫停并保存當(dāng)前所有的運(yùn)行信息,返回yield的值,并在下一次執(zhí)行next()方法時(shí)從當(dāng)前位置繼續(xù)運(yùn)行;調(diào)用一個(gè)生成器函數(shù),返回的是一個(gè)迭代器對(duì)象。

02.png

  裝飾器


  裝飾器:在不改變?cè)瘮?shù)的基礎(chǔ)上,對(duì)函數(shù)執(zhí)行前后進(jìn)行自定義操作。把目標(biāo)函數(shù)作為參數(shù)傳給裝飾器函數(shù),裝飾器函數(shù)執(zhí)行過(guò)程中,執(zhí)行目標(biāo)函數(shù),達(dá)到在目標(biāo)函數(shù)運(yùn)行前后進(jìn)行自定義操作的目的。


  應(yīng)用場(chǎng)景:如記錄函數(shù)運(yùn)行時(shí)間;flask里的路由、before_request;django中的緩存、用戶登錄等。

03.png

  裝飾器在實(shí)現(xiàn)的時(shí)候,被裝飾后的函數(shù)其實(shí)已經(jīng)是另外一個(gè)函數(shù)了(函數(shù)名等函數(shù)屬性會(huì)發(fā)生改變),為了不影響,Python的functools包中提供了一個(gè)叫wraps的裝飾器來(lái)消除這樣的副作用。寫(xiě)一個(gè)裝飾器的時(shí)候,最好在實(shí)現(xiàn)之前加上functools的wrap,它能保留原有函數(shù)的名稱和文檔字符串。

04.png

  綜上所述,這篇文章就為大家介紹到這里了,希望可以給大家?guī)?lái)一定的幫助。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/128022.html

相關(guān)文章

  • Python裝飾、迭代生成

    摘要:在學(xué)習(xí)的時(shí)候,三大名器對(duì)沒(méi)有其他語(yǔ)言編程經(jīng)驗(yàn)的人來(lái)說(shuō),應(yīng)該算是一個(gè)小難點(diǎn),本次博客就博主自己對(duì)裝飾器迭代器和生成器理解進(jìn)行解釋。 在學(xué)習(xí)python的時(shí)候,三大名器對(duì)沒(méi)有其他語(yǔ)言編程經(jīng)驗(yàn)的人來(lái)說(shuō),應(yīng)該算是一個(gè)小難點(diǎn),本次博客就博主自己對(duì)裝飾器、迭代器和生成器理解進(jìn)行解釋。 裝飾器 什么是裝飾器?裝飾從字面意思來(lái)誰(shuí)就是對(duì)特定的建筑物內(nèi)按照一定的思路和風(fēng)格進(jìn)行美化的一種行為,所謂器就是工具...

    30e8336b8229 評(píng)論0 收藏0
  • python高級(jí)特性

    摘要:常規(guī)的使用來(lái)統(tǒng)計(jì)一段代碼運(yùn)行時(shí)間的例子輸出結(jié)果總結(jié)其實(shí)是一門特別人性化的語(yǔ)言,但凡在工程中經(jīng)常遇到的問(wèn)題,處理起來(lái)比較棘手的模式基本都有對(duì)應(yīng)的比較優(yōu)雅的解決方案。 python的高級(jí)特性 名詞與翻譯對(duì)照表 generator 生成器 iterator 迭代器 collection 集合 pack/unpack 打包/解包 decorator 裝飾器 context manager ...

    yexiaobai 評(píng)論0 收藏0
  • python開(kāi)發(fā)第五篇--裝飾和內(nèi)置函數(shù)

    摘要:裝飾器的應(yīng)用場(chǎng)景比如插入日志,性能測(cè)試,事務(wù)處理,緩存等等場(chǎng)景。裝飾器完美的遵循了這個(gè)開(kāi)放封閉原則。迭代器迭代器遵循迭代器協(xié)議必須擁有方法和方法。直到函數(shù)執(zhí)行結(jié)束。調(diào)用相關(guān)函數(shù)用于檢查一個(gè)對(duì)象是否是可調(diào)用的。 裝飾器 裝飾器的含義: 1.裝飾器本質(zhì)上就是一個(gè)python函數(shù),他可以讓其他函數(shù)在不需要做任何代碼變動(dòng)的前提下,增加額外的功能,裝飾器的返回值也是一個(gè)函數(shù)對(duì)象。2.裝飾器的應(yīng)用...

    Integ 評(píng)論0 收藏0
  • Python 的閉包和裝飾

    摘要:所以,有另一種說(shuō)法認(rèn)為閉包是由函數(shù)和與其相關(guān)的引用環(huán)境組合而成的實(shí)體。 對(duì)于已經(jīng)對(duì) 閉包 或者 裝飾器有一定概念的,可以直接通過(guò)右側(cè)標(biāo)題目錄直接定位到相應(yīng)段落查看所需的內(nèi)容。 什么是裝飾器? 裝飾器(Decorator)相對(duì)簡(jiǎn)單,咱們先介紹它:裝飾器的功能是將被裝飾的函數(shù)當(dāng)作參數(shù)傳遞給與裝飾器對(duì)應(yīng)的函數(shù)(名稱相同的函數(shù)),并返回包裝后的被裝飾的函數(shù),聽(tīng)起來(lái)有點(diǎn)繞,沒(méi)關(guān)系,直接看示意圖,...

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

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

0條評(píng)論

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