三週四次課(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函數的時候,直接傳入參數就可以了。