1. 程式人生 > >10、Python_高階函式map/reduce/filter/sorted

10、Python_高階函式map/reduce/filter/sorted

1、map的使用:

map()函式可以把傳入的函式作用到傳入的Iterable中的每一個元素。

例:f(x)=x2(平方),要把這個函式作用在一個list[1,2,3,4,5,6,7,8,9]

def f(x):

    return x*x

r=map(f,[1,2,3,4,5,6,7,8,9])

 

2、reduce的用法:

reduce把一個函式作用在一個序列[x1, x2, x3, ...]上,這個函式必須接收兩個引數,reduce把結果繼續和序列的下一個元素做累積計算

例1:對一個序列求和

from functools import reduce

def add(x+y):

    return x+y

reduce(add,[1,2,3,45,5,6,7,8])

 

例2:將字串轉成int

原始版本->

from functools import reduce

def fn(x,y):

    return x*10+y

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

 

近代版本->

from functools import reduce

def fn(x,y):

    return x*10+y

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 didits[s]

reduce(fn,map(char2num,'13467'))

 

現代版本->

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 char2int(c):

        return DIGITS[c]

    return reduce(fn,map(char2int,s))

 

未來超級版本->

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()也接收一個函式和一個序列,傳入的函式依次作用於每個元素,然後根據返回值是True還是False決定保留還是丟棄該元素

例:刪除list中偶數,只留下奇數

def is_odd(n):

    return n%2 ==1

list(filter(is_odd,[1,2,4,5,6,7,8,9,32]))

 

4、sorted的用法:

sorted用於排序

 

例1:簡單排序

sorted([35,22,-44,54,234,4,65,224])

 

例2:接收一個key函式來實現自定義排序

sorted([35,22,-44,54,234,4,65,224],key=abs)

按絕對值來排序

 

例3:對字串排序

sorted(['bob','jack','Rose','City'],key=str.lower,reverse=True)

這裡先將字串變成小寫,再反向排序