python中函數(shù)總結(jié)之裝飾器閉包詳解
1、前言
函數(shù)也是一個(gè)對(duì)象,從而可以增加屬性,使用句點(diǎn)來(lái)表示屬性。
如果內(nèi)部函數(shù)的定義包含了在外部函數(shù)中定義的對(duì)象的引用(外部對(duì)象可以是在外部函數(shù)之外),那么內(nèi)部函數(shù)被稱之為閉包。
2、裝飾器
裝飾器就是包裝原來(lái)的函數(shù),從而在不需要修改原來(lái)代碼的基礎(chǔ)之上,可以做更多的事情。
裝飾器語(yǔ)法如下:
@deco2 @deco1 def func(arg1,arg2...): pass
這個(gè)表示了有兩個(gè)裝飾器的函數(shù),那么表示的含義為:func = deco2(deco1(func))
無(wú)參裝飾器語(yǔ)法如下:
@deco def func(): pass
表示的含義為func = deco(func)
有參裝飾器語(yǔ)法如下:
@deco(deco_args) def func(): pass
表示的含義為:func = deco(deco_args)(func)
多個(gè)裝飾器有的有參數(shù)有的沒(méi)參數(shù),語(yǔ)法如下:
@deco2(arg1,arg2) @deco1 def func(): pass
表示的含義為foo = deco2(arg1,arg2)deco1(func)
裝飾器實(shí)際上就是函數(shù),接受的也是函數(shù)對(duì)象。
在執(zhí)行函數(shù)之前,可以運(yùn)行預(yù)備代碼,也可以在執(zhí)行代碼后做一些清理工作。
看見(jiàn)裝飾器的時(shí)候,很可能在里面找到一些代碼,它定義了某個(gè)函數(shù),并在定義內(nèi)的某處嵌入了對(duì)目標(biāo)函數(shù)的調(diào)用或者至少一點(diǎn)引用。
3、裝飾器作用
裝飾器的作用如下:
引入日志;增加計(jì)時(shí)邏輯來(lái)檢測(cè)性能;給函數(shù)加入了事物的能力
以下例子表示為引入了計(jì)時(shí)的邏輯來(lái)檢測(cè)性能,如下:
#!/usr/bin/env python from time import ctime,sleep def tsfunc(func): #裝飾器函數(shù)接受的是一個(gè)函數(shù)對(duì)象 def wrappedFunc(): print '[%s] %s() called' % (ctime(),func.__name__) return func() #在這里調(diào)用了函數(shù)對(duì)象,也就是表示裝飾器是裝飾了原來(lái)的函數(shù),從而在原來(lái)函數(shù)的基礎(chǔ)上進(jìn)行了一些操作 return wrappedFunc @tsfunc #裝飾器 def foo(): pass foo() sleep(4) for i in range(2): sleep(1) foo()
執(zhí)行結(jié)果如下:
[root@python 420]# python deco.py [Tue Apr 19 16:15:01 2016] foo() called [Tue Apr 19 16:15:06 2016] foo() called [Tue Apr 19 16:15:07 2016] foo() called
在裝飾器函數(shù)中,增加了時(shí)間戳并且調(diào)用了目標(biāo)函數(shù),裝飾器的返回值是一個(gè)包裝了函數(shù)。
4、閉包
如果在一個(gè)內(nèi)部函數(shù)里,對(duì)在外部作用于(但不是全局作用域)的變量進(jìn)行引用,那么內(nèi)部函數(shù)被認(rèn)為是閉包c(diǎn)losure,定義在外部函數(shù)內(nèi)的但由內(nèi)部函數(shù)引用或者使用的變量稱之為自由變量。
閉包的主要作用如下:
安裝計(jì)算;隱藏狀態(tài);在函數(shù)對(duì)象和作用域中隨意的切換。
回調(diào)就是函數(shù),閉包也是函數(shù),但是能攜帶一點(diǎn)額外的作用域。
#!/usr/bin/env python def counter(start_at=0): count = [start_at] def incr(): count[0] += 1 return count[0] return incr count= counter(5) print count() print count()
在上面的例子可以看到,函數(shù)內(nèi)部的函數(shù)incr引用了外部的變量count,并且每次進(jìn)行加一,從而這個(gè)變量count稱之為自由變量。
以上這篇python中函數(shù)總結(jié)之裝飾器閉包詳解就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- Python 中的函數(shù)裝飾器和閉包詳解
- Python閉包裝飾器使用方法匯總
- Python閉包及裝飾器運(yùn)行原理解析
- Python閉包與裝飾器原理及實(shí)例解析
- Python高級(jí)特性之閉包與裝飾器實(shí)例詳解
- 詳解python中的生成器、迭代器、閉包、裝飾器
- 實(shí)例詳解Python裝飾器與閉包
- Python閉包和裝飾器用法實(shí)例詳解
- 詳解 Python中LEGB和閉包及裝飾器
- 深入理解python中的閉包和裝飾器
- Python的幾個(gè)高級(jí)語(yǔ)法概念淺析(lambda表達(dá)式閉包裝飾器)
- 簡(jiǎn)析Python的閉包和裝飾器
- 詳解Python中的裝飾器、閉包和functools的教程
- python高級(jí)語(yǔ)法之閉包和裝飾器詳解
相關(guān)文章
Python 3.6 性能測(cè)試框架Locust安裝及使用方法(詳解)
下面小編就為大家?guī)?lái)一篇Python 3.6 性能測(cè)試框架Locust安裝及使用方法(詳解)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-10-10Matplotlib實(shí)戰(zhàn)之平行坐標(biāo)系繪制詳解
平行坐標(biāo)系是一種統(tǒng)計(jì)圖表,它包含多個(gè)垂直平行的坐標(biāo)軸,每個(gè)軸表示一個(gè)字段,并用刻度標(biāo)明范圍,下面我們就來(lái)看看如何繪制平行坐標(biāo)系吧2023-08-08在Python的Flask框架中構(gòu)建Web表單的教程
Flask框架中自帶一個(gè)Form表單類,通過(guò)它的子類來(lái)實(shí)現(xiàn)表單將相當(dāng)愜意,這里就為大家?guī)?lái)Python的Flask框架中構(gòu)建Web表單的教程,需要的朋友可以參考下2016-06-06詳解Python實(shí)現(xiàn)圖像分割增強(qiáng)的兩種方法
圖像分割就是把圖像分成若干個(gè)特定的、具有獨(dú)特性質(zhì)的區(qū)域并提出感興趣目標(biāo)的技術(shù)和過(guò)程。本文將為大家分享兩個(gè)用Python實(shí)現(xiàn)像分割增強(qiáng)的方法,需要的可以參考一下2022-03-03python實(shí)現(xiàn)支持目錄FTP上傳下載文件的方法
這篇文章主要介紹了python實(shí)現(xiàn)支持目錄FTP上傳下載文件的方法,適用于windows及Linux平臺(tái)FTP傳輸文件及文件夾,需要的朋友可以參考下2015-06-06python可視化篇之流式數(shù)據(jù)監(jiān)控的實(shí)現(xiàn)
這篇文章主要介紹了python可視化篇之流式數(shù)據(jù)監(jiān)控的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08django之導(dǎo)入并執(zhí)行自定義的函數(shù)模塊圖解
這篇文章主要介紹了django之導(dǎo)入并執(zhí)行自定義的函數(shù)模塊圖解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-04-04python 使用while寫猜年齡小游戲過(guò)程解析
這篇文章主要介紹了python 使用while寫猜年齡小游戲過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-10-10python分析實(shí)現(xiàn)微信釘釘?shù)溶浖嚅_(kāi)分身
我發(fā)現(xiàn)壇友分享的很多都是通過(guò)cmd?去start?多個(gè)微信,雖然能實(shí)現(xiàn)多開(kāi),但不夠靈活,比如我上午登錄了一個(gè)微信,下午在登錄就不太好用了,當(dāng)然也可能是我start的姿勢(shì)不對(duì)。于是我就搜了下單實(shí)例原理,自己動(dòng)手實(shí)現(xiàn)了個(gè)隨用隨開(kāi)的2022-02-02