python函數(shù)

1. map()

map()函數(shù)接收兩個(gè)參數(shù),一個(gè)是函數(shù),一個(gè)是Iterable张吉,map將傳入的函數(shù)依次作用到序列的每個(gè)元素,并把結(jié)果作為新的Iterator返回催植。

def f(x):
    return x*x

r=map(f,[1,2,3,4,5])

print(list(r))

#[1, 4, 9, 16, 25]

map()作為高階函數(shù)肮蛹,事實(shí)上它把運(yùn)算規(guī)則抽象了.可以讓代碼更簡(jiǎn)潔;比如查邢,把這個(gè)list所有數(shù)字轉(zhuǎn)為字符串:

list(map(str,[1,2,3]))
print(a)
#['1', '2', '3']

2. 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 add(x,y):
    return x+y

a=reduce(add,[1,2,4])
print(a)
#7

把序列[1, 3, 5, 7, 9]變換成整數(shù)13579:

from functools import reduce
def fn(x,y):
    return x*10+y

a=reduce(fn,[1,3,5,7,9])
print(a)

把str轉(zhuǎn)換為int:

from functools import reduce
def char2num(s):
    digits = {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}
    return digits[s]
def fn(x,y):
    return x*10+y

a=reduce(fn,map(char2num,'13579'))
print(a)

整理下:

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 str2int(s):
    def fn(x, y):
        return x * 10 + y
    def char2num(s):
        return DIGITS[s]
    return reduce(fn, map(char2num, s))

或者用lambda

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

3. filter()

filter()函數(shù)用于過濾序列扰藕。
filter()也接收一個(gè)函數(shù)和一個(gè)序列缓苛,filter()把傳入的函數(shù)依次作用于每個(gè)元素,然后根據(jù)返回值是True還是False決定保留還是丟棄該元素。

例如未桥,在一個(gè)list中笔刹,刪掉偶數(shù),只保留奇數(shù):

def is_odd(n):
    return n%2 == 1

a=filter(is_odd,[1,2,4,5,56,6,7])

print(list(a))

把一個(gè)序列中的空字符串刪掉:

def not_empty(s):
    return s and s.strip()

a=list(filter(not_empty, ['A', '', 'B', None, 'C', ' sdf   s     ']))
print(a)
#['A', 'B', 'C', ' sdf   s     ']

說明:None 冬耿、空字符串的bool值為0舌菜,但是有空格的字符bool為1.所以要使用strip方法把這種字符也刪掉。

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

計(jì)算素?cái)?shù)的一個(gè)方法是埃氏篩法亦镶,它的算法理解起來非常簡(jiǎn)單:
首先日月,列出從2開始的所有自然數(shù),構(gòu)造一個(gè)序列:
2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, ...
取序列的第一個(gè)數(shù)2缤骨,它一定是素?cái)?shù)爱咬,然后用2把序列的2的倍數(shù)篩掉:
3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, ...
取新序列的第一個(gè)數(shù)3,它一定是素?cái)?shù)绊起,然后用3把序列的3的倍數(shù)篩掉:
5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, ...
取新序列的第一個(gè)數(shù)5精拟,然后用5把序列的5的倍數(shù)篩掉:
7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, ...
不斷篩下去,就可以得到所有的素?cái)?shù)虱歪。

#篩選函數(shù)
def not_multi(n):
    return lambda x: x%n>0

#初始化的一個(gè)序列是3的倍數(shù)組成
def is_iter():
    n = 1
    while True:
        n = n+2
        yield n


def prime():
    yield 2
    it = is_iter()
    while True:
        n = next(it)
        yield n
        it = filter(not_multi(n),it)#取走3后重新構(gòu)造序列

#打印小于1000的素?cái)?shù)
for n in prime():
    if n < 1000:
        print(n)
    else:
        break

4. sorted()

sorted([36, 5, -12, 9, -21])
#[-21, -12, 5, 9, 36]

sorted()函數(shù)也是一個(gè)高階函數(shù)蜂绎,它還可以接收一個(gè)key函數(shù)來實(shí)現(xiàn)自定義的排序,例如按絕對(duì)值大小排序:

sorted([36, 5, -12, 9, -21], key=abs)
#[5, 9, -12, -21, 36]
#對(duì)字符串排序笋鄙,是按照ASCII的大小比較的.'Z' < 'a'
sorted(['bob', 'about', 'Zoo', 'Credit'])
#['Credit', 'Zoo', 'about', 'bob']

sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower)
#['about', 'bob', 'Credit', 'Zoo']

sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower, reverse=True)
#['Zoo', 'Credit', 'bob', 'about']

關(guān)鍵是理解key的函數(shù)是對(duì)每個(gè)元素的映射
習(xí)題:對(duì)下面的學(xué)生和分?jǐn)?shù)排名

L = [('Bob', 75), ('Adam', 92), ('Bart', 66), ('Lisa', 88)]
def by_score(t):
    return t[1]
def by_name(t):
    return t[0].lower()

print(sorted(L,key=by_score))
print(sorted(L,key=by_name))
print(sorted(L,key=lambda x:x[1]))

#[('Bart', 66), ('Bob', 75), ('Lisa', 88), ('Adam', 92)]
#[('Adam', 92), ('Bart', 66), ('Bob', 75), ('Lisa', 88)]
#[('Bart', 66), ('Bob', 75), ('Lisa', 88), ('Adam', 92)]
#[Finished in 0.2s]
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末师枣,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子局装,更是在濱河造成了極大的恐慌坛吁,老刑警劉巖劳殖,帶你破解...
    沈念sama閱讀 211,561評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件铐尚,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡哆姻,警方通過查閱死者的電腦和手機(jī)宣增,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來矛缨,“玉大人爹脾,你說我怎么就攤上這事』眩” “怎么了灵妨?”我有些...
    開封第一講書人閱讀 157,162評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)落竹。 經(jīng)常有香客問我泌霍,道長(zhǎng),這世上最難降的妖魔是什么述召? 我笑而不...
    開封第一講書人閱讀 56,470評(píng)論 1 283
  • 正文 為了忘掉前任朱转,我火速辦了婚禮蟹地,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘藤为。我一直安慰自己怪与,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,550評(píng)論 6 385
  • 文/花漫 我一把揭開白布缅疟。 她就那樣靜靜地躺著分别,像睡著了一般。 火紅的嫁衣襯著肌膚如雪存淫。 梳的紋絲不亂的頭發(fā)上茎杂,一...
    開封第一講書人閱讀 49,806評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音纫雁,去河邊找鬼煌往。 笑死,一個(gè)胖子當(dāng)著我的面吹牛轧邪,可吹牛的內(nèi)容都是我干的刽脖。 我是一名探鬼主播,決...
    沈念sama閱讀 38,951評(píng)論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼忌愚,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼曲管!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起硕糊,我...
    開封第一講書人閱讀 37,712評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤院水,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后简十,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體檬某,經(jīng)...
    沈念sama閱讀 44,166評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,510評(píng)論 2 327
  • 正文 我和宋清朗相戀三年螟蝙,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了恢恼。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,643評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡胰默,死狀恐怖场斑,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情牵署,我是刑警寧澤漏隐,帶...
    沈念sama閱讀 34,306評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站奴迅,受9級(jí)特大地震影響青责,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,930評(píng)論 3 313
  • 文/蒙蒙 一爽柒、第九天 我趴在偏房一處隱蔽的房頂上張望吴菠。 院中可真熱鬧,春花似錦浩村、人聲如沸做葵。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,745評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽酿矢。三九已至,卻和暖如春怎燥,著一層夾襖步出監(jiān)牢的瞬間瘫筐,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,983評(píng)論 1 266
  • 我被黑心中介騙來泰國打工铐姚, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留策肝,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,351評(píng)論 2 360
  • 正文 我出身青樓隐绵,卻偏偏與公主長(zhǎng)得像之众,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子依许,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,509評(píng)論 2 348

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

  • 函數(shù)是Python內(nèi)建支持的一種封裝棺禾,我們通過把大段代碼拆成函數(shù),通過一層一層的函數(shù)調(diào)用峭跳,就可以把復(fù)雜任務(wù)分解成簡(jiǎn)...
    祐吢房_2c9a閱讀 387評(píng)論 1 1
  • 函數(shù)式編程就是一種抽象程度很高的編程范式膘婶,純粹的函數(shù)式編程語言編寫的函數(shù)沒有變量,因此蛀醉,任意一個(gè)函數(shù)悬襟,只要輸入是確...
    齊天大圣李圣杰閱讀 1,525評(píng)論 0 2
  • 函數(shù)式編程就是一種抽象程度很高的編程范式,純粹的函數(shù)式編程語言編寫的函數(shù)沒有變量滞欠,因此古胆,任意一個(gè)函數(shù)肆良,只要輸入是確...
    DramaScript閱讀 262評(píng)論 0 0
  • 本系列主要學(xué)習(xí)Python的基本使用和語法知識(shí)筛璧,后續(xù)可能會(huì)圍繞著AI學(xué)習(xí)展開。Python3 (1) Python...
    猿來如癡閱讀 2,363評(píng)論 0 0
  • 函數(shù)也是變量惹恃,可以作為函數(shù)的參數(shù)夭谤,以及返回值作為參數(shù),稱作高階函數(shù)巫糙,map reduce filter sorte...
    為瞬間停留閱讀 301評(píng)論 0 0