初學 Python(十二)——高階函式
初學 Python,主要整理一些學習到的知識點,這次是高階函式。
#-*- coding:utf-8 -*- ''''' 話說高階函式: 能用函式作為引數的函式 稱為高階函式 ''' #函式作參 def f(x): return x*x #map函式為內建函式,意思為將第二個引數的list作用到f函式中 #最後的結果為一個list print map(f,[1,2,3,4,5]) #reduce函式為內建函式,意思將第二引數的序列作用到add函式值 #將結果做累加計算,最後的結果為一個數 def add(x,y): return x+y print reduce(add,[1,2,3,4,5,6]) #給出一個整數的每個位置上的數,得到該整數 def fn(x,y): return x*10+y print reduce(fn,[1,2,3,4,5]) #字串轉int print reduce(fn,map(int,'12345')) def str2int(s): def fn(x,y): return x*10+y return reduce(fn,map(int,s)) print str2int('123456') ''''' 上面函式的呼叫步驟是: 1.得到reduce(fn,map(int,'123456')) 2.得到reduce(fn,[1,2,3,4,5,6]) 3.得到reduce(x*10+y,[1,2,3,4,5,6]) 4.得到123456 ''' def str2int2(s): return reduce(lambda x,y:x*10+y,map(int,s)) print str2int2('1234567') #排序 print sorted('313568') print sorted((1,8,4,2,5)) print sorted([9,8,7,6,5,4,3]) print sorted(['name','Age','Sex','address']) #sorted也是一個高階函式,所以它也可以傳函式來改變排序的演算法 #倒序 def inverted_order(x,y): if x>y: return -1 elif x<y: return 1 else: return 0 print sorted((1,8,4,2,5),inverted_order) #改變字串排序演算法 #上面字串排序是根據ascii碼來判斷大小 #由於大寫字母都比小寫字母的ascii碼小, #但是一般我們都是按照字母表的順序排列 #下面來變換一下演算法,忽略大小寫 def alphabet(s1,s2): l1 = s1.lower() l2 = s2.lower() if l1 < l2: return -1 elif l2 < l1: return 1 else: return 0 print sorted(['name','Age','Sex','address'],alphabet) ''''' 函式作為返回值 其實剛才在將字串轉int時就涉及到了 這種將函式作為返回值的形式 ''' def sum(*args): sum = 0 for n in args: sum+=n return sum print sum(1,2,3,4,5) #改裝成返回函式的形式 def sum_pack(*args): def sum(): sum1 = 0 for n in args: sum1+=n return sum1 return sum g = sum_pack(1,2,3,4,5) print g #<function sum at 0x0134C0F0> #g輸出為函式,想列印結果要呼叫函式 print g() ''''' 閉包的定義: 字函式自動獲取父函式的變數和引數 進入我的地盤就是我的 而且每一次呼叫返回的函式 都不是同一個物件 ''' g1 = sum_pack(1,2,3,4,5) g2 = sum_pack(1,2,3,4,5) print g1==g2