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>