今天碰到一个小程序,正好可以用到Python的filter,map和reduce方法。感觉很有意思,顺便就写下来吧。问题是这样的:
两个小伙伴,数字214和77感觉自己的运气一直不好,想来想去,原来是和7有关,如下:
2+1+4=7 77%7=11 7%11=77
满足如下规则就是和7有关,
1. 本身是7的倍数 2. 数字里包含7 3. 数字各位累加时7的倍数
下一个小程序,计算出一定范围内和7不相关的数字的平方和。
题目很简单,可以用各种语言实现,这里的demo是Python实现的。
我们可以把这个过程分成这样几个步骤:
- 产生一定范围内的数字
- 去掉和7相关的数字
- 计算平方和
第一步很简单:
range(), 10以内的range(10), 即: [1,2,3,4,5,6,7,8,9]
第二部过滤:
filter(function or None, sequence) -> list, tuple, or string
reduce(function, sequence[, initial]) -> value
function如下:
def handle(num,noluck=7): if num %noluck==0: return False l = [string.atoi(x) for x in str(num)] for num in l: if num%noluck==0: return False if reduce(lambda x,y:x+y, l)%noluck==0: return False return True
这样去掉之后的结果是:filter(handle, range(10))
第三部是计算:
map(function, sequence[, sequence, ...]) -> list
reduce(lambda x,y: x+y, map(lambda x:x*x,filter(handle, range(10))))
这里还用到了lambda和表达式推导。是不是很有意思?只有真正玩python的人才知道其中好玩的地方 :-)