以Python內置的求絕對值的函數abs()
爲例
>>> f = abs
>>> f(-10)
10
變量f現在已經指向了abs函數本身。直接調用abs()函數和調用變量f()完全相同。
函數名其實也是變量
abs
指向10
後,就無法通過abs(-10)
調用該函數了!因爲abs
這個變量已經不指向求絕對值函數而是指向一個整數10
>>> abs = 10
>>> abs(-10)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'int' object is not callable
實際代碼不要這麼寫
一個函數就可以接收另一個函數作爲參數,這種函數就稱之爲高階函數。
def add(x, y, f):
return f(x) + f(y)
用代碼驗證下:
>>> add(-5, 6, abs)
11
map/reduce
Python內建了map()
和reduce()
函數。
map()
函數接收兩個參數,一個是函數,一個是Iterable
,map
將傳入的函數依次作用到序列的每個元素
例子:
>>> def f(x):
... return x * x
...
>>> r = map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> list(r)
[1, 4, 9, 16, 25, 36, 49, 64, 81]
把這個list
所有數字轉爲字符串:
>>> list(map(str, [1, 2, 3, 4, 5, 6, 7, 8, 9]))
['1', '2', '3', '4', '5', '6', '7', '8', '9']
reduce函數
reduce
把一個函數作用在一個序列[x1, x2, x3, ...]
上,這個函數必須接收兩個參數,reduce把結果繼續和序列的下一個元素做累積計算,其效果就是:
reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)
假設Python沒有提供int()
函數,你完全可以自己寫一個把字符串轉化爲整數的函數:
>>> from functools import reduce
>>> def fn(x, y):
... return x * 10 + y
...
>>> def char2num(s):
... return {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}[s]
...
>>> reduce(fn, map(char2num, '13579'))
13579
filter
Python內建的filter()
函數用於過濾序列。
和map()
類似,filter()
也接收一個函數和一個序列。和map()
不同的是,filter()
把傳入的函數依次作用於每個元素,然後根據返回值是True
還是False
決定保留還是丟棄該元素。
例:
一個序列中的空字符串刪掉,可以這麼寫
def not_empty(s):
return s and s.strip()
list(filter(not_empty, ['A', '', 'B', None, 'C', ' ']))
# 結果: ['A', 'B', 'C']
注意到filter()
函數返回的是一個Iterator
,也就是一個惰性序列,所以要強迫filter()
完成計算結果,需要用list()
函數獲得所有結果並返回list
。
sorted 排序算法
排序也是在程序中經常用到的算法。
Python內置的sorted()
函數就可以對list進行排序:
>>> sorted([36, 5, -12, 9, -21])
[-21, -12, 5, 9, 36]
sorted()
函數也是一個高階函數,它還可以接收一個key函數來實現自定義的排序,例如按絕對值大小排序:
>>> sorted([36, 5, -12, 9, -21], key=abs)
[5, 9, -12, -21, 36]
照ASCII的大小比較的,由於’Z’ < ‘a’,下面排序不是我們想要的,應該忽略大小寫
>>> sorted(['bob', 'about', 'Zoo', 'Credit'])
['Credit', 'Zoo', 'about', 'bob']
都改成小寫進行排序:
>>> sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower)
['about', 'bob', 'Credit', 'Zoo']
反向排序,傳入第三個參數reverse=True
>>> sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower, reverse=True)
['Zoo', 'Credit', 'bob', 'about']
更多精彩請關注微信公衆賬號likeDev