Python函數淺析(二)——高階函數及匿名函數與返回函數

函數是什麼,大家都懂,就是一種特殊的映射,關係的表達式,在Python中有簡單的函數,在上一篇博文有簡單介紹,本篇將介紹高階函數,其實就是函數的嵌套(本人理解)以及匿名函數和返回函數!

map()和reduce()

  • map()

首先我們看map()函數,它比較容易理解,它接收2個參數,一個是函數,一個是Iterable(一種對象類型,可迭代的對象,它裏面的元素可以一個個提取出來,如列表,元組等等!)map()裏的第一個參數就是函數,它會作用於Iterable裏的每一個元素!下面舉出實例:

def add(x):
    return x*2
m = map(add,[1,2,3])
print(list(m)) #[2,4,6]此時輸出的是list型,也可以輸出其他的,大家隨意而已
print(tuple(m)) #(2,4,6)
  • reduce()

接着,我們看reduce()函數,這個函數也是需要2個參數,一個是函數,一個也是一個序列,它和map()的不同之處在於它會一次接收處理2個參數,得到的結果和下一個參數做累積運算!看代碼!

from functools import reduce  #它需要引入模塊

def add(x,y):
    return x+y
m = reduce(add,[1,2,3]) #運算過程1+2得出3在加上3得出結果,就是一個滾雪球的過程!
print(n) #6

filter

filter()函數和前2個函數類似,需要2個參數,一個函數一個序列,它的作用是過濾序列!看代碼!

def fun(x):
    return x%2 =0
m = filter(fun,[1,2,3,4,5,6])   
print(list(m)) #[2,4,6]  這段代碼就是過濾奇數! 

sorted()

sorted()函數我在前面的博文關於 list 的操作裏有簡單介紹!它是用來排序的函數!一般的排序只是比較元素大小,但是這種比較在字典這種類型的數據就無效了,此時必須通過函數抽象出來。呆子,看代碼!

sorted([1,5,2,6])  #[1,2,5,6]默認爲升序
sorted([1,3,-9,5],key=abs) #[1,3,5,-9] 此時,key後接一個函數,排序就按照函數的定義進行,顯然就是按照絕對值大小進行排序!
sorted(['a','b']) #['a','b']此時按照首字符的ASCLL的大小比較!
sorted([1,3,-9,5],key=abs,reverse=True) #[-9,5,3,1]此時按照key定義的函數進行排序,但是reverse=True表示反轉!

注:以上三種函數是高階函數且是Python的內置函數

匿名函數

匿名函數的提出就是爲了避免函數名衝突,不用顯式的定義函數,可以直接傳入匿名函數!其中,關鍵字lambda表示匿名函數。

tuple(map(lambda x:x+1,(1,2,3))) #(2,3,4)可以看出lambda的作用其實就是定義了一個函數實現加1的功能!

匿名函數也可以作爲一個函數對象賦給一個變量,再來調用!也可以作爲返回值!

m = lambda x:x+1
m(1) #2
def fun(x):
    return lambda:x+1

返回函數

返回函數是將函數作爲返回值返回,也就是返回的不是要的結果,而是一個函數,要想得到結果就再次調用!

def fun(*args):
    def add():
        x = 0
        for i in args:
            x = x +i
        return x
    return add

在這個求和函數中,返回值就是add函數,但是但你調用函數時:

 m = fun(1,2,3)  
 print(m) #會出現錯誤
 print(m()) #6

之所以出現這種情況的原因是因爲當我們調用m時其實返回的是add函數,並不是最終的結果,只有在調用m()時纔是計算結果!大家腦補一下!

在返回函數中有閉包的概念,這個很重要!俺們看個實例解析!

def fun():
    m = []
    for i in range(1,3)
        def add():
            return i +1
        m.append(add)
    return m
n = fun()
printn((n()) #3

對於出現這個結果大家可能我起初也是詫異的!但是理解一番就OK了!在一個函數中定義了另一個函數,並且在內部函數中調用外部函數的參數或者變量,當我們返回函數時,相關的參數和變量仍然保存在返回的函數中,稱之爲閉包!
看我們這個程序,有2個循環,但是在調用n()時,返回函數沒有立刻執行,也就是說調用n()時,我們的程序之前只是執行到了add函數之外,循環剛剛結束之時,此時的 i 明顯就是2了,所以最終的結果是3!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章