今天碰到一個小程式,正好可以用到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的人才知道其中好玩的地方 :-)