1. 程式人生 > >python-map, reduce, filter, lambda

python-map, reduce, filter, lambda

目錄

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外都是‘真’