Python【map、reduce、filter】內置函數使用說明(轉載)

轉自:http://www.blogjava.net/vagasnail/articles/301140.html?opt=adminhtml

介紹下Python 中 map,reduce,和filter 內置函數的方法:java

一:mappython

map(...)
    map(function, sequence[, sequence, ...]) -> list

說明:算法

      對sequence中的item依次執行function(item),執行結果輸出爲list。app

例子:函數

複製代碼
>>> map(str, range(5))           #對range(5)各項進行str操做
['0', '1', '2', '3', '4']        #返回列表
>>> def add(n):return n+n
... 
>>> map(add, range(5))           #對range(5)各項進行add操做
[0, 2, 4, 6, 8]
>>> map(lambda x:x+x,range(5))   #lambda 函數,各項+自己
[0, 2, 4, 6, 8]
>>> map(lambda x:x+1,range(10)) #lambda 函數,各項+1
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> map(add,'zhoujy') ['zz', 'hh', 'oo', 'uu', 'jj', 'yy'] #想要輸入多個序列,須要支持多個參數的函數,注意的是各序列的長度必須同樣,不然報錯: >>> def add(x,y):return x+y ... >>> map(add,'zhoujy','Python') ['zP', 'hy', 'ot', 'uh', 'jo', 'yn'] >>> def add(x,y,z):return x+y+z ... >>> map(add,'zhoujy','Python','test') #'test'的長度比其餘2個小 Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: add() takes exactly 2 arguments (3 given) >>> map(add,'zhoujy','Python','testop') ['zPt', 'hye', 'ots', 'uht', 'joo', 'ynp']
複製代碼

二:reducespa

reduce(...)
    reduce(function, sequence[, initial]) -> value

說明:.net

      對sequence中的item順序迭代調用function,函數必需要有2個參數。要是有第3個參數,則表示初始值,能夠繼續調用初始值,返回一個值。code

例子:htm

複製代碼
>>> def add(x,y):return x+y
... 
>>> reduce(add,range(10))        #1+2+3+...+9
45
>>> reduce(add,range(11))        #1+2+3+...+10
55
>>> reduce(lambda x,y:x*y,range(1,3),5)           #lambda 函數,5是初始值, 1*2*5
10
>>> reduce(lambda x,y:x*y,range(1,6))             #階乘,1*2*3*4*5
120
>>> reduce(lambda x,y:x*y,range(1,6),3)           #初始值3,結果再*3
360
>>> reduce(lambda x,y:x+y,[1,2,3,4,5,6]) #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_list
if __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) : 1
1
zhoujy@zhoujy:~/桌面/Python/4$ python factorial.py
Enter a Number(int) : 2
3
zhoujy@zhoujy:~/桌面/Python/4$ python factorial.py
Enter a Number(int) : 3
9
zhoujy@zhoujy:~/桌面/Python/4$ python factorial.py
Enter a Number(int) : 4
33
zhoujy@zhoujy:~/桌面/Python/4$ python factorial.py
Enter a Number(int) : 5
153
zhoujy@zhoujy:~/桌面/Python/4$ 
複製代碼

2):將100~200之內的質數挑選出來

思路:

質數是指:只有1和它自己兩個因數,如二、三、五、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 prime

if __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 :10
Enter a stop  Number :20
[11, 13, 17, 19]
zhoujy@zhoujy:~/桌面/Python/4$ python prime.py 
Enter a start Number :
Enter a stop  Number :
[]
相關文章
相關標籤/搜索