使用python實現內置map,filter,reduce,zip函數

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))
相關文章
相關標籤/搜索