python-map, reduce, filter, lambda
阿新 • • 發佈:2019-01-05
目錄
tips:以下使用到的迭代器,可迭代物件,生成器等概念可以參見我的另一篇部落格
lambda表示式
主要用於一行寫完簡單函式,簡單方便,但不能使用全域性變數,也不是程式碼塊。
>>> lambda x:x+1 # 對冒號前面的x,處理為x+1並返回 >>> lambda *args: sum(args) # 對輸入的多個引數求和,要求引數能做加法運算 >>> lambda **kwargs: 0 # 輸入任意的鍵值對引數,返回0 >>> a = lambda x:x + x >>> a(2) 4
lambda表示式經常配合map,reduce,filter這些函式使用,所以下面介紹這些函式,並結合應用。
reduce()函式
reduce(function, sequence[, initial]) -> value
tips: python3中已經放到了functools模組裡面,想要使用的話需要先匯入。
- reduce的第一個引數必須是一個函式,且該函式必須接收兩個引數,每次計算的結果返回給function函式的第一個引數,第二個引數依次從可迭代物件中取,見下方例子理解;
- reduce的第二個引數是一個可迭代物件;
- reduce的第三個引數是初始值,沒有該引數則直接使用可迭代物件的第一個值。
>>> from functools import reduce >>> reduce(lambda x,y:x+y, range(1,6)) 15 # 相當於((((1+2)+3)+4)+5) >>> reduce(lambda x,y:x+y*2, 'qwqwqw') 'qwwqqwwqqww' >>> reduce(lambda x,y:x+y, range(1,6), 6) 21 # 相當於(((((6+1)+2)+3)+4)+5) >>> reduce(lambda x:x+1, range(6)) TypeError: <lambda>() takes 1 positional argument but 2 were given # 這裡及下面的的lambda表示式都可以換成其他更復雜的函式
map()函式
map(func, *iterables) --> map object
一個非常好用的內建函式,將可迭代物件的每一個值依次傳入func函式中進行處理,並返回一個map物件(迭代器,可以使用next()依次獲取其中的值,也可以使用list進行轉換。python2中返回的是一個列表)
>>> list(map(lambda x:x+x, 'qwqw')) # 為了方便觀察,使用了list函式,將map物件直接轉換成列表
['qq', 'ww', 'qq', 'ww']
>>> QAQ = map(lambda x,y:x+y*2, 'qw', 'AS')
>>> next(QAQ)
'qAA'
>>> list(map(lambda x,y:x+y*2, 'q', 'AS'))
['qAA'] # 第一個引數從第一個可迭代物件取值,第二個從第二個可迭代物件取值,不夠則只完成最小滿足規模
>>> list(map(lambda x,y,z:x+y+z, 'q', 'AS', ''))
[]
filter()函式
filter(function or None, iterable) --> filter object
正如其名——過濾:將可迭代物件的的每個值傳遞給function進行處理,將滿足條件的值返回到一個迭代器中。如果沒有function函式,則判斷可迭代物件中每個是'真'的值,見下方實驗
>>> list(filter(lambda x:x>2, range(5)))
[3, 4]
>>> list(filter(lambda x: x != '', [1,'q', 2,'']))
[1, 'q', 2]
>>> list(filter(None,[-2.1, -1, 0, 1, 2]))
[-2.1, -1, 1, 2] # python中除0外都是‘真’