函數(shù)式編程1

高階函數(shù)

map

map()函數(shù)接收兩個(gè)參數(shù)狱庇,一個(gè)是函數(shù)塘娶,一個(gè)是Iterable约巷,map將傳入的函數(shù)依次作用到序列的每個(gè)元素记某,并把結(jié)果作為新的Iterator返回司训。
例子:將下列數(shù)字轉(zhuǎn)化為字符串

>>> list(map(str, [1, 2, 3, 4, 5, 6, 7, 8, 9]))
['1', '2', '3', '4', '5', '6', '7', '8', '9']

reduce

reduce把一個(gè)函數(shù)作用在一個(gè)序列[x1, x2, x3, ...]上,這個(gè)函數(shù)必須接收兩個(gè)參數(shù)液南,reduce把結(jié)果繼續(xù)和序列的下一個(gè)元素做累積計(jì)算壳猜,其效果就是:reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)
求和的例子:

>>> from functools import reduce
>>> def fn(x, y):
...     return x * 10 + y
...
>>> reduce(fn, [2,4,46,5])
2865

還可以用lambda函數(shù)進(jìn)一步簡化成:

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))

filter

Python內(nèi)建的filter()函數(shù)用于過濾序列。
map()類似滑凉,filter()也接收一個(gè)函數(shù)和一個(gè)序列统扳。和map()不同的是,filter()把傳入的函數(shù)依次作用于每個(gè)元素譬涡,然后根據(jù)返回值是True還是False決定保留還是丟棄該元素闪幽。
注意到filter()函數(shù)返回的是一個(gè)Iterator,也就是一個(gè)惰性序列涡匀,所以要強(qiáng)迫filter()完成計(jì)算結(jié)果盯腌,需要用list()函數(shù)獲得所有結(jié)果并返回list

用filter求素?cái)?shù)

def _odd_iter(): #生成器生成從3開始的無限奇數(shù)序列
    n = 1
    while True:
        n = n + 2
        yield n
def _not_divisible(n):#定義篩選函數(shù)
    return lambda x: x % n > 0
def primes():#不斷返回下一個(gè)素?cái)?shù)
    yield 2
    it = _odd_iter() # 初始序列
    while True:
        n = next(it) # 返回序列的第一個(gè)數(shù)
        yield n
        it = filter(_not_divisible(n), it) # 構(gòu)造新序列
for n in primes():#只輸出1000以內(nèi)
    if n < 1000:
        print(n)
    else:
        break

回?cái)?shù)是指從左向右讀和從右向左讀都是一樣的數(shù)陨瘩,例如12321腕够,909级乍。請利用filter()篩選出回?cái)?shù):

def is_palindrome(n):
    return n==int(str(n)[::-1])

sorted

排序也是在程序中經(jīng)常用到的算法。無論使用冒泡排序還是快速排序帚湘,排序的核心是比較兩個(gè)元素的大小玫荣。如果是數(shù)字,我們可以直接比較大诸,但如果是字符串或者兩個(gè)dict呢捅厂?直接比較數(shù)學(xué)上的大小是沒有意義的,因此资柔,比較的過程必須通過函數(shù)抽象出來焙贷。
Python內(nèi)置的sorted()函數(shù)就可以對list進(jìn)行排序.

>>> sorted([36, 5, -12, 9, -21], key=abs) #按絕對值大小排
[5, 9, -12, -21, 36]
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市贿堰,隨后出現(xiàn)的幾起案子辙芍,更是在濱河造成了極大的恐慌,老刑警劉巖羹与,帶你破解...
    沈念sama閱讀 211,561評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件故硅,死亡現(xiàn)場離奇詭異,居然都是意外死亡纵搁,警方通過查閱死者的電腦和手機(jī)吃衅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來腾誉,“玉大人捐晶,你說我怎么就攤上這事⊥纾” “怎么了?”我有些...
    開封第一講書人閱讀 157,162評論 0 348
  • 文/不壞的土叔 我叫張陵山上,是天一觀的道長眼耀。 經(jīng)常有香客問我,道長佩憾,這世上最難降的妖魔是什么哮伟? 我笑而不...
    開封第一講書人閱讀 56,470評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮妄帘,結(jié)果婚禮上楞黄,老公的妹妹穿的比我還像新娘。我一直安慰自己抡驼,他們只是感情好鬼廓,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,550評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著致盟,像睡著了一般碎税。 火紅的嫁衣襯著肌膚如雪尤慰。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,806評論 1 290
  • 那天雷蹂,我揣著相機(jī)與錄音伟端,去河邊找鬼。 笑死匪煌,一個(gè)胖子當(dāng)著我的面吹牛责蝠,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播萎庭,決...
    沈念sama閱讀 38,951評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼霜医,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了擎椰?” 一聲冷哼從身側(cè)響起支子,我...
    開封第一講書人閱讀 37,712評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎达舒,沒想到半個(gè)月后值朋,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,166評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡巩搏,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,510評論 2 327
  • 正文 我和宋清朗相戀三年昨登,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片贯底。...
    茶點(diǎn)故事閱讀 38,643評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡丰辣,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出禽捆,到底是詐尸還是另有隱情笙什,我是刑警寧澤,帶...
    沈念sama閱讀 34,306評論 4 330
  • 正文 年R本政府宣布胚想,位于F島的核電站琐凭,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏浊服。R本人自食惡果不足惜统屈,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,930評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望牙躺。 院中可真熱鬧愁憔,春花似錦、人聲如沸孽拷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,745評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至思犁,卻和暖如春代虾,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背激蹲。 一陣腳步聲響...
    開封第一講書人閱讀 31,983評論 1 266
  • 我被黑心中介騙來泰國打工棉磨, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人学辱。 一個(gè)月前我還...
    沈念sama閱讀 46,351評論 2 360
  • 正文 我出身青樓乘瓤,卻偏偏與公主長得像,于是被迫代替她去往敵國和親策泣。 傳聞我的和親對象是個(gè)殘疾皇子衙傀,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,509評論 2 348

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