把函數(shù)作為參數(shù)傳入,這樣的函數(shù)稱為高階函數(shù)
以下是常用的高階函數(shù):
1狸臣、map
一般情況map()函數(shù)接收兩個參數(shù)蹋砚,一個函數(shù)(該函數(shù)接收一個參數(shù))
,一個序列化焕,將傳入的函數(shù)依次作用到序列的每個元素萄窜,并返回一個新的Iterator(迭代器)
。
例如有這樣一個list:['pYthon', 'jaVa', 'kOtlin']
,現(xiàn)在要把list中每個元素首字母改為大寫撒桨,其它的改為小寫查刻,可以這樣操作:
>>> def f(s):
... return s.title()
...
>>> l = map(f, ['pYthon', 'jaVa', 'kOtlin'])
>>> list(l)
['Python', 'Java', 'Kotlin']
由于l
是一個Iterator
,所以通過list()
函數(shù)計(jì)算出整個序列凤类,并返回一個list穗泵,當(dāng)然也可以通過next(l)
逐個取出l
中的元素。
上邊的f()
谜疤,函數(shù)只有一個參數(shù)佃延,如果有多個參數(shù),那么map()
函數(shù)就可以接收一個函數(shù)以及對應(yīng)函數(shù)參數(shù)個數(shù)的序列夷磕,例如map()
函數(shù)接收的函數(shù)有兩個參數(shù)時履肃,可以再傳入兩個序列,這時兩個序列就是函數(shù)的兩個參數(shù)值坐桩,例如:
>>> def f(x, y):
... return x + y
...
>>> list(map(f, [1, 2, 3],[4, 5, 6]))
[5, 7, 9]
2尺棋、reduce
和map()用法類似,reduce把傳入的函數(shù)作用在一個序列上绵跷,但傳入的函數(shù)需要接收兩個參數(shù)膘螟,傳入函數(shù)的計(jì)算結(jié)果繼續(xù)和序列的下一個元素做累積計(jì)算。
例如有一個list抖坪,里邊的元素都是字符串萍鲸,要把它拼接成一個字符串:
>>> from functools import reduce
>>> def f(x, y):
... return x + y
...
>>> reduce(f, ['ab', 'c', 'de', 'f'])
'abcdef'
3、filter
filter()同樣接收一個函數(shù)和一個序列擦俐,然后把傳入的函數(shù)依次作用于序列的每個元素脊阴,如果傳入的函數(shù)返回true
則保留元素,否則丟棄蚯瞧,最終返回一個Iterator
嘿期。
例如一個list中元素有純字母、純數(shù)字埋合、字母數(shù)字組合的备徐,我們要保留純字母的:
>>> def f(s):
... return s.isalpha()
...
>>> l = filter(f, ['abc', 'xyz', '123kg', '666'])
>>> list(l)
['abc', 'xyz']
4、sorted
sorted()函數(shù)就是用來排序的甚颂,同時可以自己定義排序的規(guī)則蜜猾。
例如:
>>> sorted([6, -2, 4, -1])
[-2, -1, 4, 6]
這里默認(rèn)按照數(shù)字從小到大的順序排列秀菱。如果需要修改排序規(guī)則為按照絕對值排列可以新增一個key
參數(shù),代表排序規(guī)則的函數(shù):
>>> sorted([6, -2, 4, -1], key=abs)
[-1, -2, 4, 6]
因?yàn)槟J(rèn)是升序排列蹭睡,如果要改為降序可使用reverse
參數(shù):
>>> sorted([6, -2, 4, -1], key=abs, reverse=True)
[6, 4, -2, -1]
如果是字符串序列則默認(rèn)按照元素首字母的ASCII的大小衍菱,升序排列:
>>> sorted(['Windows', 'iOS', 'Android'])
['Android', 'Windows', 'iOS']
如果需要忽略大小寫,可以指定key=str.lower
或者key=str.upper
來完成肩豁。
有一個姓名脊串、身高對應(yīng)關(guān)系的list,其中每個元素是tuple清钥,現(xiàn)在要按照身高升序排列l(wèi)ist:
>>> d = [('Tom', 170), ('Jim', 175), ('Andy', 168), ('Bob', 185)]
>>> def by_height(t):
... return t[1]
...
>>> sorted(d, key=by_height)
[('Andy', 168), ('Tom', 170), ('Jim', 175), ('Bob', 185)]