介紹下Python 中 map,reduce,和filter 內置函數的方法:
一:map
map(...) map(function, sequence[, sequence, ...]) -> list
說明:
對sequence中的item依次執行function(item),執行結果輸出爲list。
例子:
>>> map(str, range(5)) [, , , , ] >>> add(n): n+>>> map(add, range(5)) [0, 2, 4, 6, 8>>> map( x:x+x,range(5)) [0, 2, 4, 6, 8>>> map(add,, , , , , >>> add(x,y): x+>>> map(add,,, , , , , >>> add(x,y,z): x+y+>>> map(add,,,) , line 1, <module>2 arguments (3>>> map(add,,,, , , , , ]
二:reduce
reduce(...) reduce(function, sequence[, initial]) -> value
說明:
對sequence中的item順序迭代調用function,函數必須要有2個參數。要是有第3個參數,則表示初始值,可以繼續調用初始值,返回一個值。
例子:
>>> add(x,y): x+>>> reduce(add,range(10)) 45 >>> reduce(add,range(11)) 55 >>> reduce( x,y:x*y,range(1,3),5) 10 >>> reduce( x,y:x*y,range(1,6)) 120 >>> reduce( x,y:x*y,range(1,6),3) 360 >>> reduce( x,y:x+y,[1,2,3,4,5,6]) 21
三:filter
filter(...) filter(function or None, sequence) -> list, tuple, or string
說明:
對sequence中的item依次執行function(item),將執行結果爲True(!=0)的item組成一個List/String/Tuple(取決於sequence的類型)返回,False則退出(0),進行過濾。
例子:
>>> def div(n):return n%2... >>> filter(div,range(5)) #返回div輸出的不等於0的真值[1, 3]>>> filter(div,range(10)) [1, 3, 5, 7, 9]>>> filter(lambda x : x%2,range(10)) #lambda 函數返回奇數,返回列表[1, 3, 5, 7, 9]>>> filter(lambda x : not x%2,range(10)) [0, 2, 4, 6, 8]>>> def fin(n):return n!='z' #過濾'z' 函數,出現z則返回False... >>> filter(fin,'zhoujy') #'z'被過濾'houjy'>>> filter(lambda x : x !='z','zhoujy') #labmda返回True值'houjy'>>> filter(lambda x : not x=='z','zhoujy') #返回:字符串'houjy'
上面的這些例子中都用到了一個 lambda表達式,下面舉個例子,更多信息見這裏。
>>> a=lambda x:x+3 >>> a(2)5 >>> a=lambda x,y:x+y>>> a(2,3)5
四,應用map,reduce,filter
1):實現5!+4!+3!+2!+1!
#!/usr/bin/env python#-*- coding:utf-8 -*-def add_factorial(n): empty_list=[] #聲明一個空列表,存各個階乘的結果,方便這些結果相加 for i in map(lambda x:x+1,range(n)): #用傳進來的變量(n)來生成一個列表,用map讓列表都+1,eg:range(5) => [1,2,3,4,5] a=reduce(lambda x,y:x*y,map(lambda x:x+1,range(i))) #生成階乘,用map去掉列表中的0 empty_list.append(a) #把階乘結果append到空的列表中 return empty_listif __name__ == '__main__': import sys#2選1#(一) try: n = input("Enter a Number(int) : ") result=add_factorial(n) #傳入變量 print reduce(lambda x,y:x+y,result) #階乘結果相加 except (NameError,TypeError): print "That's not a Number!"#(二)# result = add_factorial(int(sys.argv[1])) #傳入變量# print reduce(lambda x,y:x+y,result) #階乘結果相加
結果:
zhoujy@zhoujy:~/桌面/Python/4$ python factorial.py Enter a Number(int) : 11zhoujy@zhoujy:~/桌面/Python/4$ python factorial.py Enter a Number(int) : 23zhoujy@zhoujy:~/桌面/Python/4$ python factorial.py Enter a Number(int) : 39zhoujy@zhoujy:~/桌面/Python/4$ python factorial.py Enter a Number(int) : 433zhoujy@zhoujy:~/桌面/Python/4$ python factorial.py Enter a Number(int) : 5153zhoujy@zhoujy:~/桌面/Python/4$
2):將100~200以內的質數挑選出來
思路:
質數是指:只有1和它本身兩個因數,如2、3、5、7都是質數,即能被1和本身整除,1不是質數。
比如一個數字N,看它是否質數的話,就要看:有沒有能整除【2,N】之間的數X(不包含本身),即N%X是否爲0,要是沒有就爲質數。
所以我們要實現的算法是:拿一個數字N,去除以【2,N】之間的數X,來得到質數,即:N/2,N/3,……,N/N-2,N/N-1 ===> N/range(2,N)
#!/usr/bin/env python#-*- coding:utf-8 -*-def is_prime(start,stop): stop = stop+1 #包含列表右邊的值 prime = filter(lambda x : not [x%i for i in range(2,x) if x%i == 0],range(start,stop)) #取出質數,x從range(start,stop) 取的數 print primeif __name__ == '__main__': try : start = input("Enter a start Number :") except : start = 2 #開始值默認2 try : stop = input("Enter a stop Number :") except : stop = 0 #停止數,默認0,即不返回任何值 is_prime(start,stop)
結果:
zhoujy@zhoujy:~/桌面/Python/4$ python prime.py Enter a start Number : Enter a stop Number :10[2, 3, 5, 7] zhoujy@zhoujy:~/桌面/Python/4$ python prime.py Enter a start Number :10Enter a stop Number :20[11, 13, 17, 19] zhoujy@zhoujy:~/桌面/Python/4$ python prime.py Enter a start Number : Enter a stop Number : []