map函数(稠密紧凑的代码,特别是最后一句理解不了建议可以debug单步。)
# -*- 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函数(在处理列表的时候会对内层列表进行递归应用到过滤函数,而内置的只能对一维上的列表进行过滤)
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这种类型比较我挺不喜欢的,所以没去改:)
下面是zip函数
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))