map()函數接收兩個參數,一個是函數,一個是Iterable,map將傳入的函數依次做用到序列的每一個元素,並把結果做爲新的Iterator返回。
reduce把一個函數做用在一個序列[x1, x2, x3, ...]上,這個函數必須接收兩個參數,reduce把結果繼續和序列的下一個元素作累積計算。python
和map()相似,filter()也接收一個函數和一個序列。和map()不一樣的是,filter()把傳入的函數依次做用於每一個元素,而後根據返回值是True仍是False決定保留仍是丟棄該元素。編程
def is_palindrome(n): return n==int(str(n)[::-1]) output = filter(is_palindrome, range(1, 1000)) print('1~1000:', list(output)) if list(filter(is_palindrome, range(1, 200))) == [1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 22, 33, 44, 55, 66, 77, 88, 99, 101, 111, 121, 131, 141, 151, 161, 171, 181, 191]: print('測試成功!') else: print('測試失敗!')
sorted()函數也是一個高階函數,它還能夠接收一個key函數來實現自定義的排序,例如按絕對值大小排序:閉包
>>> sorted([36, 5, -12, 9, -21], key=abs) [5, 9, -12, -21, 36]
要進行反向排序,沒必要改動key函數,能夠傳入第三個參數reverse=True:
***app
def count(): fs = [] for i in range(1, 4): def f(): return i*i fs.append(f) return fs f1, f2, f3 = count() *** >>> f1() 9 >>> f2() 9 >>> f3() 9
緣由就在於返回的函數引用了變量i,但它並不是馬上執行。等到3個函數都返回時,它們所引用的變量i已經變成了3,所以最終結果爲9。函數式編程
def count(): def f(j): def g(): return j*j return g fs = [] for i in range(1, 4): fs.append(f(i)) # f(i)馬上被執行,所以i的當前值被傳入f() return fs *** >>> f1, f2, f3 = count() >>> f1() 1 >>> f2() 4 >>> f3() 9
def createCounter(): i = 0 def counter(): print(i) i += 1 return i return counter
def createCounter(): i = [0] def counter(): i[0] += 1 return i return counter
也能夠使用生成器函數
def createCounter(): def num(): n = 1 while 1: yield n n = n + 1 n = num() def counter(): return next(n) return counter