學習筆記(11月02日)--高階函數

三週四次課(11月2日)


1.高階函數

高級函數就是把函數當成參數傳遞的一種函數:例如:

def add(x, y, f):
    return f(x) + f(y)


print(add(-8, 11, abs))

結果:

19

解釋:

1,調用add函數,分別執行abs(-8)和abs(11),分別計算出他們的值

2,最後再做和運算


map()函數

map函數是python內置的一個高階函數,它接收一個函數f和一個list,並把list的元素依次傳遞給函數f,然後返回一個函數f處理完所有list元素的列表

例子:


def f2(x):
    return x * x


l = [1, 2, 3, 4, 5, 6]
print(map(f2, l))

結果:


[1, 4, 9, 16, 25, 36]

解釋:

1,l是一個list,把此list的元素傳入函數f2,求每個元素的平方。

2,把最終所有的計算結果合併成一個新的list,就如新的結果所示。


reduce()函數

reduce()函數也是python內置的一個高階函數。reduce()函數接收的參數和map()類似,一個函數f,一個list,但行爲和map()不同,reduce()傳入的函數f必須接收兩個參數,第一個調用是把list的前兩個元素傳遞給f,第二次調用時,就是把前面兩個list元素的計算結果當成第一個參數,list的第三個元素當成第二個參數,傳入f進行操作,以後以此類推,並返回最終結果值。

例子:


def f(x, y):
    return x + y


print(reduce(f, [1, 2, 3, 4, 5], 10))

結果:

25


解釋:

1,計算a = f(1,2)的值爲3

2,計算b = f(a,3)的值爲6

3,計算c = f(b,4)的值爲10

4,計算d = f(c,5)的值爲15

5,計算f(d,10)的值爲25

其實就相當於1+2+3+4+10,最後的10是一個默認值,即最終在執行一次。


filter()函數

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

例子:


def is_odd(x):
    return x % 2 == 1


print(filter(is_odd, [1, 2, 3, 4, 5, 6, 7]))

結果:

[1, 3, 5, 7]



解釋:

1,list的元素以此傳入到函數is_odd,

2,is_odd判斷每個元素是否符合條件,把符合條件的留下,不符合條件的捨棄

3,把最終所有符合條件的元素組成一個新的列表


sorted()函數

sorted(...)

    sorted(iterable,cmp=None,key=None,reverse=True)

對字典進行排序:

按照value進行排序

mm = dict(a=1, b=10, c=3, d=9)
print sorted(mm, iteritems(), key=lambda d: d[1], reverse=True)

作用:返回一個經過排序的列表。

第一個參數是一個iterable,返回值是一個對iterable中元素進行排序後的列表(list)。


可選的參數有三個,cmp、key和reverse:

1)cmp指定一個定製的比較函數,這個函數接收兩個參數(iterable的元素),如果第一個參數小於第二個參數,返回一個負數;如果第一個參數等於第二個參數,返回零;如果第一個參數大於第二個參數,返回一個正數。默認值爲None。


2)key指定一個接收一個參數的函數,這個函數用於從每個元素中提取一個用於比較的關鍵字。默認值爲None。


3)reverse是一個布爾值。如果設置爲True,列表元素將被倒序排列。

key參數的值應該是一個函數,這個函數接收一個參數並且返回一個用於比較的關鍵字。對複雜對象的比較通常是使用對象的切片作爲關鍵字。

例如:

students = [('john', 'A', '15'), ('jane', 'B', '12'), ('dave', 'B', '10')]
print(sorted(students, key=lambda s: s[2]) ) # 按年齡排序

結果:

[('dave', 'B', '10'), ('jane', 'B', '12'), ('john', 'A', '15')]


2.匿名函數

匿名函數就是沒有名字的函數。lambda函數是一個快速定義單行的最小函數,可以用在任何需要函數的地方

常規版本:

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

lambda版本:

r = lambda x, y: x * y
print(r(2, 3))
print(type(r))

結果:

6
<type 'function'>

解釋:

我們可以看到,r其實是一個函數模型,當我們使用r函數的時候,直接傳入參數就可以了。

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