【python】匿名函數(shù)婶博、裝飾器

匿名函數(shù): lambda

不需要顯式地定義函數(shù)瓮具,直接傳入匿名函數(shù)更方便。

>>> list(map(lambda x: x * x, [1, 2, 3, 4, 5, 6, 7, 8, 9]))
[1, 4, 9, 16, 25, 36, 49, 64, 81]

關(guān)鍵字lambda表示匿名函數(shù),冒號(hào)前面的x表示函數(shù)參數(shù)
限制:只能有一個(gè)表達(dá)式名党,不用寫return叹阔,返回值就是該表達(dá)式的結(jié)果。
好處:函數(shù)沒有名字传睹,不必?fù)?dān)心函數(shù)名沖突耳幢。

把匿名函數(shù)賦值給一個(gè)變量,再利用變量來調(diào)用該函數(shù)
>>> f = lambda x: x * x
>>> f
<function <lambda> at 0x101c6ef28>
>>> f(5)
25
同樣欧啤,也可以把匿名函數(shù)作為返回值返回睛藻,比如:
def build(x, y):
    return lambda: x * x + y * y #返回的是個(gè)函數(shù) 調(diào)用build(2,3)()

裝飾器(Decorator)

裝飾器(Decorator):要增強(qiáng)某函數(shù)的功能,但又不希望修改該函數(shù)的定義邢隧,這種在代碼運(yùn)行期間動(dòng)態(tài)增加功能的方式店印,稱之為“裝飾器”(Decorator)
1)函數(shù)的__name__屬性,獲取函數(shù)名府框。注:__是兩個(gè)_

  • 栗子
#定義一個(gè)能打印日志的decorator
def log(func):
    def wrapper(*args,**kw):
        print('call %s():'%func.__name__)
        return func(*args,**kw)
    return wrapper
#log函數(shù)接受一個(gè)函數(shù)作為參數(shù)吱窝,并返回一個(gè)函數(shù)。

*args,**kw前一個(gè)是可變參數(shù)迫靖,就是隨便傳入的參數(shù)個(gè)數(shù)不定院峡,后面那個(gè)是關(guān)鍵字參數(shù),個(gè)數(shù)不定系宜,在函數(shù)內(nèi)部自動(dòng)組裝為一個(gè)dict照激。
這個(gè)東西在函數(shù)里,感覺沒發(fā)揮啥作用盹牧。

@log  # 放在now()函數(shù)出相當(dāng)于執(zhí)行了now=log(now)
def now():
    print('2017-5-11')   
>>> now()  #即會(huì)運(yùn)行now()函數(shù)俩垃,還會(huì)在運(yùn)行now()前打印一行日志
call now():  --->這就是裝飾器里定義的,先返回了這個(gè)
2015-3-25

@log相當(dāng)于執(zhí)行now=log(now)汰寓,由于log()是一個(gè)decorator口柳,返回一個(gè)函數(shù),所以有滑,原來的now()函數(shù)仍然存在跃闹,只是現(xiàn)在同名的now變量指向了新的函數(shù),于是調(diào)用now()將執(zhí)行新函數(shù)毛好,即在log()函數(shù)中返回的wrapper()函數(shù)望艺。
  wrapper()函數(shù)的參數(shù)定義是(*args, **kw),因此肌访,wrapper()函數(shù)可以接受任意參數(shù)的調(diào)用找默。在wrapper()函數(shù)內(nèi),首先打印日志吼驶,再緊接著調(diào)用原始函數(shù)惩激。

  • 栗子
    如果decorator本身需要傳入?yún)?shù)店煞,則需要編寫一個(gè)返回decorator的高階函數(shù)
def log(text):
   def decorator(func):
       def wrapper(*args,**kw):
           print('%s %s():'%(text,func.__name__))
           return func(*args,**kw)
       return wrapper
return decorator 

寫到這里給我的感覺就是:外層的函數(shù)不斷返回內(nèi)層的函數(shù)
先最外層的log函數(shù)里傳入?yún)?shù),然后返回第二層的decorator

#以下是調(diào)用
@log('execute')
def now():
    print('2017-5-11')
now() #execute now():   2017-5-11

但是現(xiàn)在

>>> now.__name__  #返回的那個(gè)wrapper()函數(shù)名字就是'wrapper',所以現(xiàn)在now函數(shù)的名字變了
'wrapper

所以需要把原始函數(shù)的name等屬性復(fù)制到wrapper()函數(shù)中咧欣,否則浅缸,有些依賴函數(shù)簽名的代碼執(zhí)行就會(huì)出錯(cuò)。
利用Python內(nèi)置函數(shù)functools.wraps
完整的寫法:

import functools
def log(text):
    def decorator(func):
        @functools.wraps(func)  ###這個(gè)魄咕。衩椒。。呃哮兰。毛萌。。
        def wrapper(*args, **kw):
            print('%s %s():' % (text, func.__name__))
            return func(*args, **kw)
        return wrapper
    return decorator

記得外層的函數(shù)先運(yùn)行喝滞,層層套進(jìn)
還沒完阁将。。右遭。還沒完做盅。。窘哈。這么膚淺的理解吹榴,我要記得來第二波。滚婉。图筹。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市让腹,隨后出現(xiàn)的幾起案子远剩,更是在濱河造成了極大的恐慌,老刑警劉巖骇窍,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件瓜晤,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡腹纳,警方通過查閱死者的電腦和手機(jī)活鹰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來只估,“玉大人,你說我怎么就攤上這事着绷』赘疲” “怎么了?”我有些...
    開封第一講書人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵荠医,是天一觀的道長(zhǎng)吁脱。 經(jīng)常有香客問我桑涎,道長(zhǎng),這世上最難降的妖魔是什么兼贡? 我笑而不...
    開封第一講書人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任攻冷,我火速辦了婚禮,結(jié)果婚禮上遍希,老公的妹妹穿的比我還像新娘等曼。我一直安慰自己,他們只是感情好凿蒜,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開白布禁谦。 她就那樣靜靜地躺著,像睡著了一般废封。 火紅的嫁衣襯著肌膚如雪州泊。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,031評(píng)論 1 285
  • 那天漂洋,我揣著相機(jī)與錄音遥皂,去河邊找鬼。 笑死刽漂,一個(gè)胖子當(dāng)著我的面吹牛演训,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播爽冕,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼仇祭,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了颈畸?” 一聲冷哼從身側(cè)響起乌奇,我...
    開封第一講書人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎眯娱,沒想到半個(gè)月后礁苗,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡徙缴,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年试伙,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片于样。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡疏叨,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出穿剖,到底是詐尸還是另有隱情蚤蔓,我是刑警寧澤,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布糊余,位于F島的核電站秀又,受9級(jí)特大地震影響单寂,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜吐辙,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一宣决、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧昏苏,春花似錦尊沸、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至救巷,卻和暖如春壶熏,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背浦译。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來泰國打工棒假, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人精盅。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓帽哑,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親叹俏。 傳聞我的和親對(duì)象是個(gè)殘疾皇子妻枕,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345

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

  • 匿名函數(shù) 1)匿名函數(shù)有個(gè)限制,就是只能有一個(gè)表達(dá)式粘驰,不用寫return屡谐,返回值就是該表達(dá)式的結(jié)果。 2)因?yàn)闆]有...
    木凜閱讀 447評(píng)論 0 0
  • 基礎(chǔ)1.r''表示''內(nèi)部的字符串默認(rèn)不轉(zhuǎn)義2.'''...'''表示多行內(nèi)容3. 布爾值:True蝌数、False(...
    neo已經(jīng)被使用閱讀 1,660評(píng)論 0 5
  • Python進(jìn)階框架 希望大家喜歡愕掏,點(diǎn)贊哦首先感謝廖雪峰老師對(duì)于該課程的講解 一、函數(shù)式編程 1.1 函數(shù)式編程簡(jiǎn)...
    Gaolex閱讀 5,489評(píng)論 6 53
  • 裝飾器 定義: 假設(shè)我們要增強(qiáng)now()函數(shù)的功能顶伞,比如饵撑,在函數(shù)調(diào)用前后自動(dòng)打印日志,但又不希望修改now()函數(shù)...
    summer_lz閱讀 467評(píng)論 0 0
  • 因?yàn)樯眢w原因最近回家不是很積極唆貌,一想要一天開車來回就感覺累滑潘。今天早上起來感覺狀態(tài)還好,就直接開車回家了锨咙,決定也很突...
    雨季不再來2017閱讀 100評(píng)論 -1 0