11.函數(shù)式編程:匿名函數(shù)项郊、高階函數(shù)、裝飾器

lambda表達(dá)式

def add(x, y):
    return x + y

print(add(1, 2))

f = lambda x, y: x + y

print(f(1, 2))

匿名函數(shù)的簡(jiǎn)單使用斟赚。
匿名函數(shù)最適合的場(chǎng)景是需要傳入函數(shù)作為參數(shù)着降,返回值的操作不復(fù)雜的地方
python對(duì)匿名函數(shù)的支持非常有限

三元表達(dá)式

表達(dá)式版本的if...else...
其他語(yǔ)言的表達(dá)式x > y ? x : y
python的表達(dá)式 x if x > y else y
三元表達(dá)式經(jīng)常用在lambda匿名函數(shù)中

map

list_x = [1, 2, 3, 4, 5, 6, 7, 8]

def f1(x):
    return x * x

list_y = map(f1, list_x)
print(list_y)  # 生成的是惰性的序列
print(list(list_y))

map會(huì)對(duì)可迭代對(duì)象的每一項(xiàng)執(zhí)行函數(shù) f1 并返回新的可迭代對(duì)象

map與lambda

list_x = [1, 2, 3, 4, 5, 6, 7, 8]

list_y = map(lambda x: x * x, list_x)
print(list_y)  # 生成的是惰性的序列
print(list(list_y))

傳入多個(gè)參數(shù)的map,將計(jì)算幾個(gè)參數(shù)中長(zhǎng)度最短的序列次數(shù)的映射(下例中為6次)

# map

list_x = [1, 2, 3, 4, 5, 6, 7, 8]
list_y = [1, 2, 3, 4, 5, 6]

r1 = map(lambda x: x * x, list_x)
print(r1)  # 生成的是惰性的序列
print(list(r1))

r2 = map(lambda x, y: x + y, list_x, list_y)
print(r2)
print(list(r2))

map 和 reduce 組合 能非常簡(jiǎn)單地構(gòu)建一個(gè)字符串轉(zhuǎn)換成整數(shù)的方法 ->

from functools import reduce

DIGITS = {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}

def char2num(s):
    return DIGITS[s]

def str2int(s):
    return reduce(lambda x, y: x * 10 + y, map(char2num, s))

reduce

from functools import reduce

list_x = [1, 2, 3, 4, 5, 6, 7, 8]

r2 = reduce(lambda x, y: x + y, list_x)
print(r2)

reduce運(yùn)算規(guī)則拗军,連續(xù)計(jì)算任洞,調(diào)用列表的第一個(gè)和第二個(gè)參數(shù),通過(guò)傳入的函數(shù)進(jìn)行計(jì)算发侵,返回值作為第一個(gè)參數(shù)交掏,然后從列表讀取第三個(gè)參數(shù)作為函數(shù)的第二個(gè)參數(shù),再進(jìn)行計(jì)算刃鳄。盅弛。。直至參數(shù)調(diào)用結(jié)束叔锐。返回計(jì)算值挪鹏。
二維數(shù)組的累加(累積計(jì)算,本處為相加)
reduce(func, param, initial) 函數(shù)愉烙、參數(shù)列表讨盒、初始值

from functools import reduce

move_list = [(1, 1), (-2, 1), (1, -3), (2, -4)]

result = reduce(lambda x, y: (x[0] + y[0], x[1] + y[1]), move_list, (10, 10))

print(result)

大數(shù)據(jù)計(jì)算模型: map/reduce
編程模型 map 映射 reduce 歸約
大規(guī)模并行計(jì)算
借鑒思想:函數(shù)式編程

filter

過(guò)濾

def _not_divisible(n):
    return lambda x: x % n > 0

def primes():
    yield 2
    it = _odd_iter() # 初始序列
    while True:
        n = next(it) # 返回序列的第一個(gè)數(shù)
        yield n
        it = filter(_not_divisible(n), it) # 構(gòu)造新序列

判斷列表字符是否大寫,如果不是則去除齿梁,是則保留

list_u = ["a", "B", "c", "F", "e"]
re_d2 = filter(lambda s: s if s.isupper() else "", list_u)

print(list(re_d2))

命令式編程vs函數(shù)式編程

命令式編程:
func
條件判斷
循環(huán)

函數(shù)式編程: # 理論上可以用map\reduce 替換所有 if..else... for
map
reduce
filter
lambda 算子

裝飾器

更多的是一種設(shè)計(jì)模式

裝飾器 二

import time

def time_dec(func):
    def func__(*args, **kw):
        print(time.time())
        return func(*args, **kw)
    return func__

@time_dec
def f1(name):
    print("This is a function" + name)

f1("name)

裝飾器 三

語(yǔ)法糖 @funcname
采用了語(yǔ)法糖裝飾函數(shù)催植,沒帶括號(hào),已經(jīng)運(yùn)行了一層勺择。
需要注意調(diào)用和引用的區(qū)別,需要注意調(diào)用次數(shù)和引用次數(shù)伦忠。
python裝飾器大量應(yīng)用了AOP的設(shè)計(jì)模式及思想:
在軟件業(yè)省核,AOP為Aspect Oriented Programming的縮寫,意為:面向切面編程昆码,通過(guò)預(yù)編譯方式和運(yùn)行期動(dòng)態(tài)代理實(shí)現(xiàn)程序功能的統(tǒng)一維護(hù)的一種技術(shù)气忠。
https://baike.baidu.com/item/AOP/1332219?fr=aladdin

裝飾器 四

非常經(jīng)典的關(guān)于多重裝飾器的裝飾順序,應(yīng)該深入理解赋咽。

def decorator_a(func):
    print('Get in decorator_a')

    def inner_a(*args, **kwargs):
        print('Get in inner_a')
        return func(*args, **kwargs)

    return inner_a


def decorator_b(func):
    print('Get in decorator_b')

    def inner_b(*args, **kwargs):
        print('Get in inner_b')
        return func(*args, **kwargs)

    return inner_b


@decorator_b
@decorator_a
def f(x):
    print('Get in f')
    return x * 2
# 初始化的時(shí)候旧噪,先初始化a,a才能返回一個(gè)函數(shù)對(duì)象用于初始化b脓匿,否則沒有對(duì)象給b去初始化淘钟。
# 初始化完成之后,返回的是一個(gè)b函數(shù)陪毡,調(diào)用b函數(shù)米母,才能返回a函數(shù)的調(diào)用從而完成整個(gè)裝飾過(guò)程

f(1)

裝飾器的傳入?yún)?shù)勾扭,因?yàn)槠渫ㄓ眯裕枰獋魅肟勺儏?shù):*args, **kwargs铁瞒。妙色。。

裝飾器 五

加上關(guān)鍵字參數(shù)

裝飾器 六

收尾
裝飾器思想:
想對(duì)某一個(gè)被封裝的單元修改某個(gè)功能慧耍,而不改變?cè)a身辨。(開閉原則)
對(duì)功能拓展

哪些地方會(huì)用到:
flask
多重裝飾

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市芍碧,隨后出現(xiàn)的幾起案子煌珊,更是在濱河造成了極大的恐慌,老刑警劉巖师枣,帶你破解...
    沈念sama閱讀 218,546評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件怪瓶,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡践美,警方通過(guò)查閱死者的電腦和手機(jī)洗贰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)陨倡,“玉大人敛滋,你說(shuō)我怎么就攤上這事⌒烁铮” “怎么了绎晃?”我有些...
    開封第一講書人閱讀 164,911評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)杂曲。 經(jīng)常有香客問(wèn)我庶艾,道長(zhǎng),這世上最難降的妖魔是什么擎勘? 我笑而不...
    開封第一講書人閱讀 58,737評(píng)論 1 294
  • 正文 為了忘掉前任咱揍,我火速辦了婚禮,結(jié)果婚禮上棚饵,老公的妹妹穿的比我還像新娘煤裙。我一直安慰自己,他們只是感情好噪漾,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,753評(píng)論 6 392
  • 文/花漫 我一把揭開白布硼砰。 她就那樣靜靜地躺著,像睡著了一般欣硼。 火紅的嫁衣襯著肌膚如雪题翰。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,598評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音遍愿,去河邊找鬼存淫。 笑死,一個(gè)胖子當(dāng)著我的面吹牛沼填,可吹牛的內(nèi)容都是我干的桅咆。 我是一名探鬼主播,決...
    沈念sama閱讀 40,338評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼坞笙,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼岩饼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起薛夜,我...
    開封第一講書人閱讀 39,249評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤籍茧,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后梯澜,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體寞冯,經(jīng)...
    沈念sama閱讀 45,696評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,888評(píng)論 3 336
  • 正文 我和宋清朗相戀三年晚伙,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了吮龄。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,013評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡咆疗,死狀恐怖漓帚,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情午磁,我是刑警寧澤尝抖,帶...
    沈念sama閱讀 35,731評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站迅皇,受9級(jí)特大地震影響昧辽,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜登颓,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,348評(píng)論 3 330
  • 文/蒙蒙 一奴迅、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧挺据,春花似錦、人聲如沸脖隶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)产阱。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間王暗,已是汗流浹背悔据。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工绷雏, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留头滔,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,203評(píng)論 3 370
  • 正文 我出身青樓涎显,卻偏偏與公主長(zhǎng)得像坤检,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子期吓,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,960評(píng)論 2 355

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

  • 原文鏈接:https://github.com/EasyKotlin 值就是函數(shù)早歇,函數(shù)就是值。所有函數(shù)都消費(fèi)函數(shù)讨勤,...
    JackChen1024閱讀 5,978評(píng)論 1 17
  • 直接上正文 函數(shù)是Python內(nèi)建支持的一種封裝悬襟,我們通過(guò)把大段代碼拆成函數(shù)衅码,通過(guò)一層一層的函數(shù)調(diào)用,就可以把復(fù)雜...
    OzanShareing閱讀 448評(píng)論 0 0
  • 今天是母親節(jié)脊岳,我很害羞地逝段、想跟你們小小推薦一下 我媽媽的公眾號(hào)。 1. 媽媽的公眾號(hào)開通時(shí)間不長(zhǎng)割捅,是我?guī)退?cè)的奶躯。...
    燕仰閱讀 1,498評(píng)論 2 2
  • 說(shuō)明:
    codingRaabit2閱讀 300評(píng)論 0 0
  • 今日體驗(yàn):今天晚上和店長(zhǎng)在門口坐著,他給我提到了現(xiàn)在正是學(xué)知識(shí)的好時(shí)光亿驾,做什么都要認(rèn)真專研嘹黔,珍惜現(xiàn)在。...
    GL_212a閱讀 86評(píng)論 0 0