map函數(稠密緊湊的代碼,特別是最後一句理解不了建議能夠debug單步。)python
# -*- coding: cp936 -*- def myselfmap(f,*args): def urgymap(f,args): if args==[]: return [] else: return [f(args[0])]+urgymap(f,args[1:]) if list(args)[0]==[]: #*args有多個參數被傳遞時返回tuple return [] else: return [apply(f,urgymap(lambda x: x[0],list(args)))]+apply(myselfmap,[f]+urgymap(lambda x: x[1:],list(args))) #--------------------------test-------------------------- >>> myselfmap(lambda x: x*2,[1,2,3,4,5]) # => [2, 4, 6, 8, 10] >>> myselfmap(lambda x: x*2,[[6,7,8],1,2,3,4,5]) # => [[6, 7, 8, 6, 7, 8], 2, 4, 6, 8, 10] >>> myselfmap(lambda x,y,z: x+y+z,[1,2,3],[4,5,6],[7,7,9]) # => [12, 14, 18]
filter函數(在處理列表的時候會對內層列表進行遞歸應用到過濾函數,而內置的只能對一維上的列表進行過濾)app
def myselffilter(prediate,s): if(isinstance(s,list)): if(s==[]): return [] elif(isinstance(s[0],list)): return [myselffilter(prediate,s[0])]+myselffilter(prediate,s[1:]) elif(prediate(s[0])): return [s[0]]+myselffilter(prediate,s[1:]) else: return myselffilter(prediate,s[1:]) elif(isinstance(s,tuple)): if(s==()): return () elif(isinstance(s[0],tuple)): return myselffilter(prediate,s[0])+myselffilter(prediate,s[1:]) elif(prediate(s[0])): return s[0]+myselffilter(prediate,s[1:]) else: return myselffilter(prediate,s[1:]) else: if(s==""): return "" elif(prediate(s[0])): return s[0]+myselffilter(prediate,s[1:]) else: return myselffilter(prediate,s[1:]) #-------------------test---------------------- >>> myselffilter(lambda x: x>2,(1,2,3,(4,5,6))) # => (3, (4, 5, 6)) >>> myselffilter(lambda x: x>2,[1,2,3,[4,5,6]]) # => [3, [4, 5, 6]]
reduce函數(這個最簡單,就是一個遞歸的累積,當枚舉完序列的元素以後,返回初始值)函數
def myselfreduce(fun,s,initial=0): if(s==[]): return initial if(s==()): return initial if(s==""): return initial return s[0]+myselfreduce(fun,s[1:],initial)
PS:和內置的filter不同,原本是能夠改爲同樣的,可是我以爲python這種類型比較我挺不喜歡的,因此沒去改:)
debug
下面是zip函數code
def myselfzip(*lis): concatTimes = min(map(lambda x: len(x), lis)) if (concatTimes == 0): return [] return [tuple(map(lambda x : x[0], lis))] + apply(myselfzip,map(lambda x : x[1:],lis))