標籤:sort 位置 return 順序 pack 整理 擷取 改變 高階函數
初學 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
初學 Python(十二)——高階函數