python高階函數(shù)

把函數(shù)作為參數(shù)傳入,這樣的函數(shù)稱為高階函數(shù),函數(shù)式編程就是指這種高度抽象的編程范式

map/reduce

我們先看map。map()函數(shù)接收兩個參數(shù),一個是函數(shù),一個是Iterable,map將傳入的函數(shù)依次作用到序列的每個元素,并把結果作為新的Iterator返回。

def f(x):
    return x*x
r = map(f, [1,2,3,4])
print(list(r)) # [1,4,9,16]

再看reduce的用法。reduce把一個函數(shù)作用在一個序列[x1, x2, x3, ...]上,這個函數(shù)必須接收兩個參數(shù),reduce把結果繼續(xù)和序列的下一個元素做累積計算
reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)

filter

和map()類似,filter()也接收一個函數(shù)和一個序列。和map()不同的是,filter()把傳入的函數(shù)依次作用于每個元素,然后根據(jù)返回值是True還是False決定保留還是丟棄該元素
注意到filter()函數(shù)返回的是一個Iterator,也就是一個惰性序列,所以要強迫filter()完成計算結果,需要用list()函數(shù)獲得所有結果并返回list。

sorted

sorted()函數(shù)也是一個高階函數(shù),它還可以接收一個key函數(shù)來實現(xiàn)自定義的排序,例如按絕對值大小排序

sorted([36, 5, -12, 9, -21], key=abs)

函數(shù)作為返回值

我們來實現(xiàn)一個可變參數(shù)的求和。通常情況下,求和的函數(shù)是這樣定義的

def calc_sum(*args):
    ax = 0
    for n in args:
        ax = ax + n
    return ax

但是,如果不需要立刻求和,而是在后面的代碼中,根據(jù)需要再計算怎么辦?可以不返回求和的結果,而是返回求和的函數(shù)

def lazy_sum(*args):
  def calc_sum(*args):
    ax = 0
    for n in args:
        ax = ax + n
    return ax
return calc_sum

閉包

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

f1, f2, f3 = count()

全部都是9!原因就在于返回的函數(shù)引用了變量i,但它并非立刻執(zhí)行。等到3個函數(shù)都返回時,它們所引用的變量i已經變成了3,因此最終結果為9

返回閉包時牢記一點:返回函數(shù)不要引用任何循環(huán)變量,或者后續(xù)會發(fā)生變化的變量。

如果一定要引用循環(huán)變量怎么辦?方法是再創(chuàng)建一個函數(shù),用該函數(shù)的參數(shù)綁定循環(huán)變量當前的值,無論該循環(huán)變量后續(xù)如何更改,已綁定到函數(shù)參數(shù)的值不變:

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)立刻被執(zhí)行,因此i的當前值被傳入f()
    return fs

裝飾器

本質上,decorator就是一個返回函數(shù)的高階函數(shù)。所以,我們要定義一個能打印日志的decorator

import functools
def log(func):
    @functools.wraps(func)
    def wrapper(*arg,**kw):
        print('call %s',%func.__name__)
        return func(*arg, **kw)
    return wrapper

@log
def now():
    print('2015-3-25')

如果decorator本身需要傳入參數(shù),那就需要編寫一個返回decorator的高階函數(shù),寫出來會更復雜。比如,要自定義log的文本

import functools
def log(text):
    def decorator(func):
        @functools.wraps(func)
        def wrapper(*args, **kw):
            print('%s %s():' % (text, func.__name__))
            return func(*args, **kw)
        return wrapper
    return decorator

@log('execute')
def now():
    print('2015-3-25')
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 一個函數(shù)就可以接收另一個函數(shù)作為參數(shù),這種函數(shù)就稱之為高階函數(shù)。 一、map、reduce map是內置函數(shù),re...
    張磊_e325閱讀 160評論 0 0
  • 總目錄:http://www.itdecent.cn/p/e406a9bc93a9 Python - 子目錄:h...
    寒暄_HX閱讀 365評論 0 2
  • 高階函數(shù) Higher-order function 1. map() map(fn,Interable)函數(shù)接收...
    前端轉轉閱讀 122評論 0 0
  • 目錄:http://www.itdecent.cn/p/863c446364a8 一、高階函數(shù) 什么是高階函數(shù)?...
    久遇_days閱讀 274評論 0 3
  • 我是黑夜里大雨紛飛的人啊 1 “又到一年六月,有人笑有人哭,有人歡樂有人憂愁,有人驚喜有人失落,有的覺得收獲滿滿有...
    陌忘宇閱讀 8,814評論 28 54

友情鏈接更多精彩內容