Python學習之旅(十三)
Python基礎知識(12):函式(Ⅲ)
高階函式
1、map
map()
函式接收兩個引數,一個是函式,一個是Iterable
,map
將傳入的函式依次作用到序列的每個元素,並把結果作為新的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']