2020-012 python閉包與裝飾器

python閉包與裝飾器

閉包

函數(shù)和對其周圍狀態(tài)(lexical environment崔泵,詞法環(huán)境)的引用捆綁在一起構(gòu)成閉包closure)博助。也就是說险污,閉包可以讓你從內(nèi)部函數(shù)訪問外部函數(shù)作用域。

常用語言基本都實現(xiàn)了閉包富岳。

閉包中最重要的是蛔糯,我們返回了一個內(nèi)部函數(shù)。

def power(n):
    def func(m):
        return m**n
    return func

power函數(shù)中窖式,我們定義了一個func函數(shù)蚁飒,func函數(shù)接收底數(shù)m,從外部power函數(shù)中拿到指數(shù)n萝喘,返回冪m**n淮逻。

這個簡單的定義可以使我們獲得能夠進行任何指數(shù)操作的函數(shù)。

power2 = power(2)
power5 = power(5)
power10 = power(10)
print(power2(4))
print(power5(4))
print(power5(10))

out:

16
1024
100000

閉包使我們能夠通過函數(shù)創(chuàng)造各種各樣的類似函數(shù)蜒灰,是不是很神奇?

今天我也寫了一個閉包弦蹂。它能夠接收gtf文件返回某個染色體位置的基因。

def get_gene(file="Homo_sapiens_GRCh37_87_geneonly.gtf"):
    gtf = pd.read_csv(file, header=None, sep='\t')
    gtf['gene_name'] = gtf[8].apply(lambda x: re.search(r'gene_name \"(.*?)\"', x).group(1))

    def fetch(chrom, start):
        start = int(start)
        value = gtf[(gtf[0] == chrom) & (gtf[3] <= start) & (gtf[4] >= start)]['gene_name'].tolist()
        if value:
            return value[0]
        else:
            return None

    return fetch

創(chuàng)建具體的fetch强窖。

fetch = get_gene()
fetch(10,103454465)

out:

'FBXW4'

這樣就可以避免重復操作文件凸椿,變量值也不會暴露在環(huán)境中。

裝飾器

裝飾器的作用就是為已經(jīng)存在的對象添加額外的功能翅溺。

其實裝飾器也是一個閉包脑漫,但是我們一般不用裝飾器修改函數(shù)功能。

def square(n):
    print(f'square {n}')
    return n**2
    
square(2)

out:

square 2
4

寫一個裝飾器咙崎,能夠在函數(shù)執(zhí)行前打印執(zhí)行時間优幸。

import time
def decorator(func):
    def wrapper(*args,**kwargs):
        print(time.time())
        return func(*args,**kwargs)  
    return wrapper
    
@decorator
def square(n):
    print(f'square {n}')
    return n**2

out:

1597498618.3460186
square 2
4

其實@decorator實現(xiàn)的就是square = decorator(square),這樣就用返回的函數(shù)替換了原來的square褪猛,但是decorator會在打印時間后繼續(xù)執(zhí)行原函數(shù)网杆,原函數(shù)在裝飾器內(nèi)部以外部函數(shù)變量存在(閉包,不是嗎),這樣就為函數(shù)添加了額外的功能碳却。


學會队秩,點贊!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末昼浦,一起剝皮案震驚了整個濱河市馍资,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌关噪,老刑警劉巖鸟蟹,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異使兔,居然都是意外死亡建钥,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進店門火诸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來锦针,“玉大人,你說我怎么就攤上這事置蜀。” “怎么了悉盆?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵盯荤,是天一觀的道長。 經(jīng)常有香客問我焕盟,道長秋秤,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任脚翘,我火速辦了婚禮灼卢,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘来农。我一直安慰自己鞋真,他們只是感情好,可當我...
    茶點故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布沃于。 她就那樣靜靜地躺著涩咖,像睡著了一般。 火紅的嫁衣襯著肌膚如雪繁莹。 梳的紋絲不亂的頭發(fā)上檩互,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天,我揣著相機與錄音咨演,去河邊找鬼闸昨。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的饵较。 我是一名探鬼主播拍嵌,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼告抄!你這毒婦竟也來了撰茎?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤打洼,失蹤者是張志新(化名)和其女友劉穎龄糊,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體募疮,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡炫惩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了阿浓。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片他嚷。...
    茶點故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖芭毙,靈堂內(nèi)的尸體忽然破棺而出筋蓖,到底是詐尸還是另有隱情,我是刑警寧澤退敦,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布粘咖,位于F島的核電站,受9級特大地震影響侈百,放射性物質(zhì)發(fā)生泄漏瓮下。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一钝域、第九天 我趴在偏房一處隱蔽的房頂上張望讽坏。 院中可真熱鬧,春花似錦例证、人聲如沸路呜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽拣宰。三九已至,卻和暖如春烦感,著一層夾襖步出監(jiān)牢的瞬間巡社,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工手趣, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留晌该,地道東北人肥荔。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像朝群,于是被迫代替她去往敵國和親崖堤。 傳聞我的和親對象是個殘疾皇子郑原,可洞房花燭夜當晚...
    茶點故事閱讀 43,486評論 2 348

推薦閱讀更多精彩內(nèi)容