1. 程式人生 > >Python學習之旅(十三)

Python學習之旅(十三)

Python基礎知識(12):函式(Ⅲ)

高階函式

1、map

map()函式接收兩個引數,一個是函式,一個是Iterablemap將傳入的函式依次作用到序列的每個元素,並把結果作為新的Iterator返回。

def test(x):
    return x+2
n=map(test,[1,2,3,4,5])
list(n)

結果:

[3, 4, 5, 6, 7]

把列表中的數字轉換成字串

list(map(str,[1,2,3,4,5]))

結果:

['1', '2', '3', '4', '5']

 

2、reduce

接收兩個引數,一個函式,一個序列,reduce會

把結果繼續和序列的下一個元素做累積計算

如對序列[1,2,3,4,5]求和

def add(x,y):
    return x+y

reduce(add,[1,2,3,4,5])

結果:15

把序列[1,2,3]轉換成整數15

def test(x,y):
    return x*10+y

reduce(test,[1,2,3])

結果:123

與map函式配合使用,把str轉換成int

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 strint(s): def fn(x,y): return x*10+y def charnum(s): return digits[s] return reduce(fn,map(charnum,s)) strint("123")

結果:123

可以用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 charnum(s): return digits[s] def strint(s): return reduce(lambda x,y:x*10+y,map(charnum,s)) strint("123")

結果:123

3、filter

filter函式用於過濾序列,它接收兩個引數,一個函式一個序列

filter函式會根據函式內的條件遍歷序列,判斷每個元素的布林值,如果為True則保留

filter()函式返回的是一個Iterator,所以要強迫filter()完成計算結果,需要用list()函式獲得所有結果並返回list

def test(x):
    return x%2==0

list(filter(test,[1,3,6,8,10,17]))

結果:

[6, 8, 10]

刪除序列中的空字元

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

list(filter(not_empty, ['Alice', '', 'Bob', None, 'May', '  ']))

結果:

['Alice', 'Bob', 'May']

4、sorted

可以對字串和列表中的元素進行排序

sorted([84,24,1,136,21])

  sorted(["Bob","abc","May","Alice"])

結果:

[1, 21, 24, 84, 136]

['Alice', 'Bob', 'May', 'abc']

注:字母進行排序時,大寫字母排在小寫字母前面

 

接收一個key函式實現自定義,如按絕對值大小排序

sorted([-32,6,10,-1,0],key=abs)

結果:

[0, -1, 6, 10, -32]

對字母進行排序時忽略大小寫,即先將字母轉換成大寫(或小寫),然後再進行排序

sorted(["Bob","abc","May","Alice"],key=str.upper)
sorted(["Bob","abc","May","Alice"],key=str.lower)

結果:

['abc', 'Alice', 'Bob', 'May']

 

如果要進行反向排序,可以使用引數reverse=True

sorted(["Bob","abc","May","Alice"],key=str.lower,reverse=True)

結果:

['May', 'Bob', 'Alice', 'abc']