再說(shuō)函數(shù)1

函數(shù)的引用賦值和參數(shù)操作

python中的函數(shù)操作,本身也就是一個(gè)對(duì)象磕瓷,常規(guī)定義語(yǔ)法的函數(shù)就是將一個(gè)函數(shù)對(duì)象的引用地址賦值給函數(shù)名稱的變量腥椒,通過(guò)函數(shù)名稱的變量調(diào)用執(zhí)行函數(shù)

如果函數(shù)是對(duì)象虽惭,那么函數(shù)也可以和對(duì)象一樣可以被引用賦值

#函數(shù)的引用賦值
def show():
    print("函數(shù)執(zhí)行了")

#將函數(shù)的地址賦值給一個(gè)變量
a = show
#通過(guò)調(diào)用這個(gè)變量也可以執(zhí)行函數(shù)
a()

輸出結(jié)果:

圖1.png

同樣梧宫,函數(shù)也可以被當(dāng)成參數(shù)傳遞給其他函數(shù)執(zhí)行

#函數(shù)的傳值操作接谨,策略模式
def show(message):
    message()

def show_msg():
    print("函數(shù)1執(zhí)行了")

def show_msg2():
    print("函數(shù)2執(zhí)行了")

#調(diào)用執(zhí)行參數(shù)show
show(show_msg)
show(show_msg2)

輸出結(jié)果:

圖2.png

裝飾器函數(shù):

軟件開發(fā)原則中摆碉,有一項(xiàng)OCP原則((open close principle:開閉原則)

OCP原則((open close principle:開閉原則):對(duì)軟件功能的擴(kuò)展開放,對(duì)軟件原來(lái)代碼的修改關(guān)閉脓豪。

既然如此巷帝,如何在函數(shù)中添加功能但是又不修改函數(shù)的代碼呢?

python提供了一種新的處理方式,可以更加友好的在符合OCP原則的情況下擴(kuò)展函數(shù)的操作功能扫夜,稱為裝飾器函數(shù)

例如:

原函數(shù)如下楞泼,客戶要求在每段函數(shù)開始和結(jié)束時(shí)添加提示語(yǔ)句:

  def record_info():
       print("模擬,記錄用戶信息")

  def show_info():
      print("模擬笤闯,展示用戶信息")

#調(diào)用記錄用戶信息
record_info()
#調(diào)用展示用戶信息

show_info()按客戶需求在遵守OCP原則的情況下修改代碼如下:

#定義一個(gè)裝飾器函數(shù)
def decorators(fn):
    def wrapper(*args, **kwargs):
        print("函數(shù)準(zhǔn)備執(zhí)行")
        result = fn(*args, **kwargs)
        print("函數(shù)執(zhí)行結(jié)束")
        return result
    return wrapper

@decorators
def record_info():
   print("模擬堕阔,記錄用戶信息")

@decorators
def show_info():
    print("模擬,展示用戶信息")

#調(diào)用記錄用戶信息
record_info()
#調(diào)用展示用戶信息

show_info()輸出結(jié)果:

圖3.png

裝飾器函數(shù)執(zhí)行過(guò)程:

圖4.png

函數(shù)擴(kuò)展內(nèi)容:

1望侈、偏函數(shù):

引入模塊 from functools import partial

通過(guò)偏函數(shù)模塊可以給當(dāng)前函數(shù)賦值定義一個(gè)特殊的訪問(wèn)函數(shù),特殊的訪問(wèn)函數(shù)可以給原來(lái)的函數(shù)增加一個(gè)默認(rèn)值

示例:

 引入函數(shù)工具模塊中的偏函數(shù)擴(kuò)展
from functools import partial

# 定義普通函數(shù)
def calculation(num1, num2, opra):
    res = None
    if opra == "+":
        res = num1 + num2
    elif opra == "-":
        res = num1 - num2
    elif opra == "*":
        res = num1 * num2
    elif opra == "/":
        res = num1 / num2
    return res

# 普通函數(shù)的調(diào)用
result = calculation(12, 10, "+")
print(result)

# 通過(guò)偏函數(shù)進(jìn)行處理勋桶,添加默認(rèn)操作方式
calculation2 = partial(calculation, opra="+")
result = calculation2(22, 24)
print(r輸出結(jié)果:
圖5.png

但是偏函數(shù)的操作脱衙,在一定程度上來(lái)說(shuō)只是一個(gè)語(yǔ)法糖,因?yàn)閜ython中對(duì)于函數(shù)參數(shù)的處理已經(jīng)有默認(rèn)值的操作例驹,完全可以代替偏函數(shù)的復(fù)雜操作捐韩。

2、閉包函數(shù):

因?yàn)楹瘮?shù)的出現(xiàn)鹃锈,變量出現(xiàn)了分化:全局變量荤胁,局部變量

全局變量:在聲明開始的任意地方都可以訪問(wèn)

局部變量:在當(dāng)前函數(shù)中可以操作

但在有些情況下,我們需要在函數(shù)外部直接操作函數(shù)中的數(shù)據(jù)屎债,怎么進(jìn)行操作呢:

1仅政、將函數(shù)中的數(shù)據(jù)通過(guò)返回值進(jìn)行返回

2、通過(guò)閉包函數(shù)進(jìn)行操作

返回值的操作方式比較固定單一盆驹,能作為簡(jiǎn)單數(shù)據(jù)處理的手段

但更加靈活的操作方式就是閉包函數(shù)

所謂閉包函數(shù):就是在函數(shù)中聲明另一個(gè)變量

修飾器函數(shù)就是一個(gè)閉包函數(shù)

例如:

# 閉包函數(shù)
def outer():
    print("外部函數(shù)")

    def inner():
        print("內(nèi)部函數(shù):閉包函數(shù)")

    return inner


# 調(diào)用執(zhí)行outer()函數(shù)時(shí)圆丹,得到一個(gè)函數(shù)對(duì)象的返回值
x = outer()
# 該返回值是一個(gè)函數(shù),所以也可以執(zhí)行
x()輸出結(jié)果:
圖6.png

3躯喇、匿名函數(shù):

匿名函數(shù)辫封,又稱lambda表達(dá)式:通過(guò)一個(gè)表達(dá)式實(shí)現(xiàn)函數(shù)功能。主要作用是簡(jiǎn)化函數(shù)操作廉丽,將簡(jiǎn)單的處理邏輯封裝在一個(gè)表達(dá)式中倦微,而省去了定義函數(shù)的復(fù)雜的操作方式

主要起到簡(jiǎn)單處理函數(shù)的功能,所以 lambda 表達(dá)式才在很多地方被稱為匿名函數(shù)

基本語(yǔ)法結(jié)構(gòu):

lambda 參數(shù)列表:運(yùn)算表達(dá)式

lambda關(guān)鍵字

參數(shù)列表:用于給表達(dá)式傳遞數(shù)據(jù)

表達(dá)式語(yǔ)句:計(jì)算表達(dá)式正压,計(jì)算結(jié)果會(huì)自動(dòng)輸出

使用注意事項(xiàng):

主要用于替代功能簡(jiǎn)單的函數(shù)欣福,提高代碼的簡(jiǎn)潔性

但是不要濫用,大量使用會(huì)造成代碼可讀性嚴(yán)重下降

示例:

# 匿名函數(shù):lambda表達(dá)式
fn = lambda x, y: x + y


# 等價(jià)于
def fn2(x, y):
    return x + y


print(fn(1, 2))
print(fn2(1, 2))

輸出結(jié)果:

圖7.png

如有錯(cuò)誤焦履,敬請(qǐng)指出

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末劣欢,一起剝皮案震驚了整個(gè)濱河市棕诵,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌凿将,老刑警劉巖校套,帶你破解...
    沈念sama閱讀 218,941評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異牧抵,居然都是意外死亡笛匙,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門犀变,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)妹孙,“玉大人,你說(shuō)我怎么就攤上這事获枝〈勒” “怎么了?”我有些...
    開封第一講書人閱讀 165,345評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵省店,是天一觀的道長(zhǎng)嚣崭。 經(jīng)常有香客問(wèn)我,道長(zhǎng)懦傍,這世上最難降的妖魔是什么雹舀? 我笑而不...
    開封第一講書人閱讀 58,851評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮粗俱,結(jié)果婚禮上说榆,老公的妹妹穿的比我還像新娘。我一直安慰自己寸认,他們只是感情好签财,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著偏塞,像睡著了一般荠卷。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上烛愧,一...
    開封第一講書人閱讀 51,688評(píng)論 1 305
  • 那天油宜,我揣著相機(jī)與錄音,去河邊找鬼怜姿。 笑死慎冤,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的沧卢。 我是一名探鬼主播蚁堤,決...
    沈念sama閱讀 40,414評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼但狭!你這毒婦竟也來(lái)了披诗?” 一聲冷哼從身側(cè)響起撬即,我...
    開封第一講書人閱讀 39,319評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎呈队,沒想到半個(gè)月后剥槐,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,775評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡宪摧,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年粒竖,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片几于。...
    茶點(diǎn)故事閱讀 40,096評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蕊苗,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出沿彭,到底是詐尸還是另有隱情朽砰,我是刑警寧澤,帶...
    沈念sama閱讀 35,789評(píng)論 5 346
  • 正文 年R本政府宣布喉刘,位于F島的核電站瞧柔,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏饱搏。R本人自食惡果不足惜非剃,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評(píng)論 3 331
  • 文/蒙蒙 一置逻、第九天 我趴在偏房一處隱蔽的房頂上張望推沸。 院中可真熱鬧,春花似錦券坞、人聲如沸鬓催。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)宇驾。三九已至,卻和暖如春猴伶,著一層夾襖步出監(jiān)牢的瞬間课舍,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工他挎, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留筝尾,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,308評(píng)論 3 372
  • 正文 我出身青樓办桨,卻偏偏與公主長(zhǎng)得像筹淫,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子呢撞,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評(píng)論 2 355

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