精析python中的裝飾器 生成器

2022-08-31 20:27:13 字數 2365 閱讀 4581

裝飾器:

在程式設計時,要遵循乙個原則,就是開放-封閉原則。

在不破壞原函式的情況下,要想對原函式進行一些修飾,那麼這裡就要用到裝飾器。

例如:你完成了一些用函式寫成的專案,此時公司正在年度考核,你需要給你寫的每乙個函式都加上乙個計算時間的功能,隨即考核完成後,又需要把函式恢復原狀,到了下一階段考核,可能又要用到這個計算時間功能,一般來說專案中的函式是很多的,怎樣才能一次性的為所有函式加上功能呢?

這裡就要用到裝飾器這個知識點。

此處呼叫原函式時,可以發現函式的功能是可以正常執行的,符合了程式設計開放-封閉的規則,而設定了乙個可以控制的變數flage,通過改變flage的值,控制裝飾器的開關。

分析:@time_out(flage) 可以把@和time_out(flage)分開來看,在python中程式都是從右向左執行的,所以先執行time_out(flage)這層函式,將timer的記憶體位址給返回給@,而@就等於wahaha = timer(wahaha),再將inner的記憶體位址返回出來,在呼叫wahaha()時,其本質就是在呼叫inner,而在inner的內部做到了flage控制裝飾器的功能,這裡用到了閉包這個概念。

閉包:在內層函式可以引用外層函式的變數,在使用裝飾器時,就是利用了閉包這個原理,在執行完外層函式後,並沒有把變數立即釋放掉,而是封裝在函式的內部。

生成器:

生成器的本質就是迭代器,那麼什麼是迭代器呢?這涉及到什麼是可迭代的物件。

可迭代的物件:含有__iter__方法的物件,可以通過.__dict__檢視命名空間判斷,可迭代的物件一定可以被for迴圈,例如str、list、dir、set、range等等

而迭代器就是同時擁有__iter__和__next__方法的可迭代物件。而可迭代物件可以通過呼叫__iter__方法成為乙個迭代器。

言歸正傳,生成器就是迭代器的一種,生成器有兩種表現形式,第一種是生成器函式,第二種是生成器表示式。

生成器函式就是含有yield關鍵字的函式

生成器函式特點:呼叫函式之後函式不會執行,而是返回乙個生成器,每次調動next()方法時才會去取出乙個值。直到取到了最後乙個值,再執行一次next(),那麼程式就會報錯。

生成器表示式:g=(i for i in range(10))

此時的g就是乙個生成器了,比函式更方便。

從生成器中取值的幾個方法:

1.next 2.for 3.資料型別的強制轉換 例如:list(g) g代表乙個生成器

強制轉換存在乙個缺點就是會瞬間占用記憶體,如果生成器中儲存的資料較多,那麼有撐爆記憶體的風險,造成電腦宕機。而for迴圈和next都是乙個乙個去取的,即拿即用,所以不存在這個風險。

分析生成器:

此例中g=test()時並沒有去執行任何操作,只是把生成器返回給了g,在遇到for迴圈生成器巢狀問題時,需要把問題拆分。

n=1時,g=(add(i,n) for i in test()) #此時的g就是test()

n=10,g=(add(i,n) for i in g=(add(i,n) for i in test()))#此時的g是上面的g,g被重新賦值了一次。

n=5,g=(add(i,n) for i in (add(i,n) for i in g=(add(i,n) for i in test())),此時g又被賦值了一次,現在可以將n=5代入計算了,test()取到的就是0,1,2,3

生成器中還有乙個send()的方法

send()的效果與next基本一致,只是在獲取下乙個值的時候,給上乙個yield傳遞乙個資料(訊號)。

send()使用時的注意事項,第一次使用生成器的時候,是用next獲取下乙個值的,最後乙個yield也不能接受外部的值。

例:

來分析一下程式執行的過程,首先g=test(),那麼g就是乙個生成器,隨後a=g.__next__(),使生成器執行一次並yield1,此時count=這個賦值語句還沒來得及執行就被yield打斷了,先返回了1,所以print(a)能得到123,1

然後呼叫了send('hello'),此時count=賦值語句執行,將hello賦值給了count,列印出*****=hello,然後再列印456,yield2,程式再次終止。

相對於next來說send方法使用的少。

漸進式解讀python裝飾器 精

a.python裝飾器解釋 python裝飾器就是用於拓展原來函式功能的一種函式,使用python裝飾器的好處就是在不用更改原函式的 前提下給函式增加新的功能。可能 原函式已經上線了,不好修改 b.定義乙個新函式 引數是 函式名 在新函式中呼叫老函式並加新功能。此新函式就是裝飾器。如下 老函式有 看...

python中的裝飾器

其實去年就開始學python了,零零散散,陸陸續續學了點,期間學習了python web開發,爬蟲系統 但是一些基礎性的知識點長時間不看了就會忘,所以寫個部落格記錄下來,忘了可以隨時檢視,不用回去看 了,希望也能幫助大家學習哈。python中的裝飾器decorator其實是乙個高階函式,它接受乙個函...

Python 中的裝飾器

1.基本概念 問題 裝飾器是什麼?解答 嚴格來說,裝飾器只是語法糖,裝飾器是可呼叫的物件,可以像常規的可呼叫物件那樣呼叫,特殊的地方是裝飾器的引數是乙個函式 問題 裝飾器有什麼特性?解答 裝飾器有 個特性,一是可以把被裝飾的函式替換成其他函式,二是可以在載入模組時候立即執行 def decorate...