最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python中的生成器、迭代器、裝飾器詳解

 更新時(shí)間:2022年07月08日 10:56:23   作者:小旭2021  
本文詳細(xì)講解了python中的生成器、迭代器、裝飾器,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

一、裝飾器

由于一個(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.什么是迭代器?為何要有迭代器?

對(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)建迭代器:

迭代器python實(shí)例

生成器

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

使用生成器生成斐波那些數(shù)列

裝飾器

裝飾器:在不改變?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中的緩存、用戶登錄等。

使用裝飾器記錄函數(shù)運(yùn)行時(shí)間

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

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python二分查找+字符串模板+textwrap模塊,

    Python二分查找+字符串模板+textwrap模塊,

    這篇文章主要介紹了Python二分查找+字符串模板+textwrap模塊,文章圍繞主題展開(kāi)詳細(xì)內(nèi)容,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-05-05
  • Python函數(shù)基礎(chǔ)實(shí)例詳解【函數(shù)嵌套,命名空間,函數(shù)對(duì)象,閉包函數(shù)等】

    Python函數(shù)基礎(chǔ)實(shí)例詳解【函數(shù)嵌套,命名空間,函數(shù)對(duì)象,閉包函數(shù)等】

    這篇文章主要介紹了Python函數(shù)基礎(chǔ),結(jié)合實(shí)例形式詳細(xì)分析了函數(shù)嵌套,命名空間,函數(shù)對(duì)象,閉包函數(shù)等相關(guān)概念、原理、用法及操作注意事項(xiàng),需要的朋友可以參考下
    2019-03-03
  • python3 實(shí)現(xiàn)對(duì)圖片進(jìn)行局部切割的方法

    python3 實(shí)現(xiàn)對(duì)圖片進(jìn)行局部切割的方法

    今天小編就為大家分享一篇python3 實(shí)現(xiàn)對(duì)圖片進(jìn)行局部切割的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-12-12
  • 淺談keras使用中val_acc和acc值不同步的思考

    淺談keras使用中val_acc和acc值不同步的思考

    這篇文章主要介紹了淺談keras使用中val_acc和acc值不同步的思考,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-06-06
  • pandas中的.assign()方法的用法示例小結(jié)

    pandas中的.assign()方法的用法示例小結(jié)

    pandas中的.assign()方法用于創(chuàng)建一個(gè)新的DataFrame,其中包含現(xiàn)有DataFrame的副本,并附加了指定的新列或更新了現(xiàn)有列,.assign()方法還可以鏈?zhǔn)绞褂?以添加多個(gè)新列或更新現(xiàn)有列,對(duì)pandas中的.assign()方法感興趣的朋友跟隨小編一起看看吧
    2023-10-10
  • numpy如何獲取array中數(shù)組元素的索引位置

    numpy如何獲取array中數(shù)組元素的索引位置

    這篇文章主要介紹了numpy獲取array中數(shù)組元素的索引位置,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-01-01
  • python創(chuàng)建生成器以及訪問(wèn)的方法詳解

    python創(chuàng)建生成器以及訪問(wèn)的方法詳解

    這篇文章主要介紹了python創(chuàng)建生成器以及訪問(wèn)的方法詳解,與列表一次性地將數(shù)據(jù)全都加載到內(nèi)存不同的是,生成器使用推斷加載數(shù)據(jù),每次只推斷出一個(gè)對(duì)象,在數(shù)據(jù)量比較大時(shí),可以節(jié)省內(nèi)存,需要的朋友可以參考下
    2023-11-11
  • Python對(duì)PDF文件的常用操作方法詳解

    Python對(duì)PDF文件的常用操作方法詳解

    PDF是Portable?Document?Format的縮寫,這類文件通常使用`.pdf`作為其擴(kuò)展名。在日常開(kāi)發(fā)工作中,最容易遇到的就是從PDF中讀取文本內(nèi)容以及用已有的內(nèi)容生成PDF文檔這兩個(gè)任務(wù)。本文為大家介紹了幾個(gè)Python中常見(jiàn)的PDF操作,需要的可以參考一下
    2022-05-05
  • 淺談python中的占位符

    淺談python中的占位符

    這篇文章主要介紹了淺談python中的占位符,分享了其簡(jiǎn)單實(shí)例,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-11-11
  • TensorFlow隱藏操作探索(張量操作和定制模型算法)

    TensorFlow隱藏操作探索(張量操作和定制模型算法)

    這篇文章主要為大家介紹了TensorFlow隱藏操作探索(張量操作和定制模型算法),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-11-11

最新評(píng)論

绵竹市| 武山县| 揭阳市| 新巴尔虎右旗| 中山市| 深泽县| 云林县| 莱阳市| 郑州市| 德化县| 彭泽县| 根河市| 玛沁县| 大姚县| 梅州市| 全椒县| 阳原县| 岚皋县| 惠安县| 沈阳市| 扎囊县| 安阳市| 漾濞| 三亚市| 全州县| 芜湖县| 清苑县| 贵港市| 长阳| 丰都县| 南皮县| 惠东县| 富川| 靖安县| 商洛市| 怀来县| 桦南县| 渝北区| 武清区| 文水县| 安图县|