高階函數

高階函數

高階函數滿足上面至少一個特點。

  • 能接收若干個函數作爲參數
  • 能返回一個函數
    import math
    def add(x, y, f):
        return f(x) + f(y)

    # 平方和
    print add(25, 9, math.sqrt)

map()函數

它接收一個函數 f 和一個list,並通過把函數 f 依次作用在 list 的每個元素上,得到一個新的 list 並返回。

def format_name(s):
    a=s.lower()
    return a[0].upper()+a[1:]
# 得到['Adam', 'Lisa', 'Bart']
print map(format_name, ['adam', 'LISA', 'barT'])

reduce()函數

它接收一個函數 f、一個list及一個可選的默認初始結果值,傳入的函數f必須接收兩個參數,reduce()對list的每個元素反覆調用函數f,並返回最終結果值。

def prod(x, y):
    return x*y

#結果爲2*4*5*7*12=3360
print reduce(prod, [2, 4, 5, 7, 12])

filter()函數

filter()函數接收一個函數 f 和一個list,這個函數f的作用是對每個元素進行判斷,返回 True或 False,filter()根據判斷結果自動過濾掉不符合條件的元素,返回由符合條件(函數返回true)元素組成的新list。

def is_not_empty(s):
    return s and len(s.strip()) > 0
    
# 輸出['test', 'str', 'END']
filter(is_not_empty, ['test', None, '', 'str', '  ', 'END'])

返回函數

函數可以返回一個函數,被返回的函數要在裏面定義,當作一個對象返回。

def calc_prod(lst):
    def fun():
        def prod(x,y):
            return x*y
        return reduce(prod,lst,1)
    return fun

#輸出24 (4!=24)
f = calc_prod([1, 2, 3, 4])
print f()

閉包

在計算機科學中,閉包(Closure)是詞法閉包(Lexical Closure)的簡稱,是引用了自由變量的函數。這個被引用的自由變量將和這個函數一同存在,即使已經離開了創造它的環境也不例外。
函數定義和函數表達式位於另一個函數的函數體內。

函數A返回內部定義的函數B,則B爲閉包,調用A時傳遞的參數爲自由變量。

閉包特點是返回的函數還引用了外層函數的局部變量,所以,要正確使用閉包,就要確保引用的局部變量在函數返回後不能變

def count():
    fs = []
    for i in range(1, 4):
        def product(a=i):
            return a*a
        fs.append(product)
    return fs

f1, f2, f3 = count()
#返回 1 4 9
print f1(), f2(), f3()

decorator

裝飾器可簡化代碼,常用於:

  • 打印日誌,@log
  • 檢測性能,@performance
  • 數據庫事務,@transaction
  • URL路由,@post('/login')

Python的decorator本質上是一個高階函數,接收一個函數作爲參數,並返回一個新函數。

import time

def performance(f):
    def fn(*args, **kw):
        t1 = time.time()
        r = f(*args, **kw)
        t2 = time.time()
        print 'call %s() in %fs' % (f.__name__, (t2 - t1))
        return r
    return fn

@performance
def factorial(n):
    return reduce(lambda x,y: x*y, range(1, n+1))

#結果:
#call factorial() in 0.009082s 
#3628800
print factorial(10)

functools.partial

functools.partial用於創建偏函數,即可把一個參數多的函數變爲一個參數少的新函數,少的參數需要在創建時指定默認值,這樣,新函數調用的難度就降低了。

int2 = functools.partial(int, base=2)

# int(value,base=2),按照二進制將value轉爲十進制數值

#結果:64
int2('1000000')
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章