map、reduce、filter、sorted函數
Python內置map、reduce、filter、sorted函數。
map函數
map函數接受兩個參數,一個是函數,一個是Iterable(迭代對象),map將傳入的函數依次作用到序列的每個元素,並把結果作爲新的Iterator
返回。
有一個函數 f(x)=x²
,要把這個函數作用到一個list [1,2,3,4]
上,用map實現:
map傳入第一個參數是 f 也就是f函數本身,結果 k 是一個Iterator,Iterator是惰性序列,通過 list()
函數讓他把整個序列計算出來並返回一個list。
上述計算也可以寫一個循環計算出來:
用循環寫出來不簡潔,用 map 函數一眼就可以看出來。
map函數還可以計算任意負載函數,比如,把這個list所有字符串轉爲數字:
只需要一行代碼。
reduce函數
reduce用法是把一個函數作用在一個序列[1,2,3,4,5]上,這個函數必須接收兩個參數,reduce 把結果繼續和序列的下一個元素做累積計算,效果如下:
對一個序列求積:
把序列[1, 3, 5, 7, 9]變換成整數13579:
結合map、reduce函數,把字符串'123.456'
轉換成浮點數123.456:
filter()函數
和map()類似,filter()也接收一個函數和一個序列。和map()不同的是,filter()把傳入的函數依次作用於每個元素,然後根據返回值是True還是False決定保留還是丟棄該元素。
一個list中,刪掉奇數,只保留偶數:
(lambda是匿名函數)
filter()函數返回的是一個Iterator,也就是一個惰性序列,所以要強迫filter()完成計算結果,需要用list()函數獲得所有結果並返回list。
sorted()函數
sorted()函數就可以對list進行排序:
sorted()函數是一個高階函數,它還可以接收一個key函數來實現自定義的排序,例如按絕對值大小排序:
key指定的函數將作用於list的每一個元素上,並根據key函數返回的結果進行排序。對比原始的list和經過key=abs處理過的list:
然後sorted()函數按照keys進行排序,並按照對應關係返回list相應的元素:
字符串排序的例子:
默認情況下,對字符串排序,是按照ASCII的大小比較的,由於'Z' < 'a',結果,大寫字母Z會排在小寫字母a的前面。
排序應該忽略大小寫,按照字母序排序。要實現這個算法,不必對現有代碼大加改動,只要我們能用一個key函數把字符串映射爲忽略大小寫排序即可。忽略大小寫來比較兩個字符串,實際上就是先把字符串都變成大寫(或者都變成小寫),再比較。
給sorted傳入key函數,即可實現忽略大小寫的排序:
進行反向排序,不必改動key函數,可以傳入第三個參數reverse=True:
用sorted()排序的關鍵在於實現一個映射函數。