經驗拾憶(純手工)=> Python高階函數操做

map

In [25]: list(map(lambda a:a**2, [1,2,3,4]))
Out[25]: [1, 4, 9, 16]
解釋:map就至關於 把每一個序列元素 的每個 單獨用一個管道函數處理,
     再把他們按順序組合成一個新可迭代對象
注意:這個管道函數 只能是單參數函數,若是想傳遞多個參數怎麼辦???
    1. 使用偏函數 paitial (怕有些人看不懂,這裏就不用lambda了,而是用普通函數定義方式)
        In [58]: def f(a,b):
            ...:     return a**2,b
        In [59]: f = partial(f,b='固定值')
        In [60]: list(map(f,[1,2,3,4]))
        Out[60]: [(1, '固定值'), (4, '固定值'), (9, '固定值'), (16, '固定值')]
        
       固然仍是提供一下lambda的方式吧,看看有多簡潔。
        In [64]: list(map(partial(lambda a,b:(a**2,b),b='固定值') ,[1,2,3,4]))
        Out[64]: [(1, '固定值'), (4, '固定值'), (9, '固定值'), (16, '固定值')]
        
    2. 若是想對map傳遞多個參數,除了上面用偏函數,還能夠使用下面介紹的starmap  
      
map多參應用場景:進程池的imap (之後我也會寫Python三器三程的文章)

starmap

In [30]: list(starmap(lambda a,b:a+b,( (1,2),(3,4))))
Out[30]: [3, 7]
解釋一下:
    starmap 和 partial雖然均可以解決 map傳多參,但仍是有一些區別的
    starmap的 每一對的多個參數 都是密切相關的
    partial的 偏參數 是和全部 主參數 所有相關的

reduce

In [87]: from functools import reduce
In [88]: reduce(lambda a,b:a*b, [1,2,3,4])
Out[88]: 24
解釋一下:reduce 至關於對一個序列'累'的操做 (累加、累乘等),返回結果就是累值

filter

In [100]: list(filter(lambda a:a if a>2 else None, [1,2,3,4]))
Out[100]: [3, 4]
解釋一下:和map思想同樣,根據條件過濾序列。

sorted

In [128]: dict1 = {'學號2':'1','學號1':'2'}
In [129]: sorted(dict1.items(),key=lambda x:x[1])
Out[129]: [('學號2', '1'), ('學號1', '2')]
解釋一下:和list的sort函數相似,  但這個sorted的優勢是針能夠對全部序列排序

zip

In [132]: list(zip((1,2),(3,4,5)))
Out[132]: [(1, 3), (2, 4)]
解釋一下:每一個子序列對應位置進行組合, 若是格式不匹配,則會捨棄不匹配的那一項

三目運算

三目運算符能夠使代碼簡介邏輯清晰(雖然 or and 也是能夠使代碼邏輯簡潔,但有些燒腦,我幾乎不用~~)
In [78]: print(1 if 0==0 else 2)
Out[78]: 1

推導式

其實有時用推導式也能夠代替部分高階操做,而且推導式的效率也高
1. 列表推導式
    In [77]: [1 for _ in range(5) if 1==1]
    Out[77]: [1, 1, 1, 1, 1]

2. 集合推導式
    In [6]: {x for x in [1,2,1,2]}
    Out[6]: {1, 2}

3. 字典推導式
    In [18]: {value:key for key,value in {'name':'tom'}.items()}
    Out[18]: {'tom': 'name'}

4. 生成器 (生成器還有另外的方式,後面還會三程三器)
    In [23]: (x for x in range(10))
    Out[23]: <generator object <genexpr> at 0x0000024A4CFA8BA0>
相關文章
相關標籤/搜索