1. 程式人生 > >Python中lambda表示式、reduce函式、map函式、zip函式

Python中lambda表示式、reduce函式、map函式、zip函式

對Python這幾個常用的小函式做一個彙總學習,參考了一些資料,有不妥的地方請原諒。

1、lambda函式

lambda是Python的一個內建函式,但是比def簡單很多。lambda不同於其他函式,主體是一個表示式,在程式碼內部嵌入一個函式的定義。工程用的比較多的是程式內部一些選擇語句執行時,使用lambda比較簡潔方便,經常遇到配合reduce函式使用。

函式速寫

func = lambda x,y:x+y

func(1,2)
Out[3]: 3

除外,lambda表示式也可以用在def函式中。

上面定義了一個func1函式,返回了一個lambda表示式。其中lambda表示式獲取def作用域內變數名x的值,a是action函式的返回值。等價於:a=lambda y:2+y

當然也可以使用巢狀的lambda表示式,實現上面功能。不過從程式可讀性角度來說,應該避免這種使用。

2、reduce函式

2.1 reduce函式的語法

reduce(function, iterable[, initializer])
  • function -- 函式,有兩個引數
  • iterable -- 可迭代物件
  • initializer -- 可選,初始引數

返回函式計算後的結果。

reduce() 函式會對引數序列中元素進行累積。函式將一個數據集合(連結串列,元組等)中的所有資料進行下列操作:用傳給 reduce 中的函式 function(有兩個引數)先對集合中的第 1、2 個元素進行操作,得到的結果再與第三個資料用 function 函式運算,最後得到一個結果。

2.2 程式例項

在Python3中reduce() 被從全域性名字空間裡移除,被放置在 fucntools 模組中,使用時需要通過匯入functools 模組來呼叫 reduce() ,比如:from functools import reduce

>>>def add(x, y) :            
...     return x + y
... 
>>> reduce(add, [1,2,3,4,5])   # 計算列表和:1+2+3+4+5
15
>>> reduce(lambda x, y: x+y, [1,2,3,4,5])  # 使用 lambda 匿名函式
15
from functools import reduce

def add(x,y):
    return x + y

print (reduce(add, range(1, 101)))
#結果為5050


#求階乘,n為5
n = 5
reduce(lambda x,y:x*y, range(1,n+1))
#結果為120

 3、map函式

3.1map函式語法

map(function, iterable, ...)
  • function -- 函式
  • iterable -- 一個或多個序列

返回值:Python 2 返回列表,Python 3返回迭代器

 map() 會根據提供的函式對指定序列做對映。第一個引數 function 以引數序列中的每一個元素呼叫 function 函式,返回包含每次 function 函式返回值的新列表。

3.2幾個例項(例子引用的資料[2])

>>>def square(x) :            # 計算平方數
...     return x ** 2
... 
>>> map(square, [1,2,3,4,5])   # 計算列表各個元素的平方
[1, 4, 9, 16, 25]
>>> map(lambda x: x ** 2, [1, 2, 3, 4, 5])  # 使用 lambda 匿名函式
[1, 4, 9, 16, 25]
 
# 提供了兩個列表,對相同位置的列表資料進行相加
>>> map(lambda x, y: x + y, [1, 3, 5, 7, 9], [2, 4, 6, 8, 10])
[3, 7, 11, 15, 19]

 

如果函式有多個引數, 但每個引數的序列元素數量不一樣, 會根據最少元素的序列進行,上面z的元素只有四個,所以結果執行為:

1**2+2+100=103

2**2+3+100=107

3**2+4+100=113

4**2+5+100=121

map函式和filter函式對比

>>> res1 = map(lambda n: n > 5, range(10))
>>> lt1 = list(res1)
>>> print(lt1)
[False, False, False, False, False, False, True, True, True, True]

>>> res2 = filter(lambda n: n > 5, range(10))
>>> lt = list(res2)
>>> print(lt) 
[6, 7, 8, 9]

 filter是通過生成 True 和 False 組成的迭代器將可迭代物件中不符合條件的元素過濾掉;而map返回的則是 True 和 False 組成的迭代器。

#參考https://www.cnblogs.com/caizhao/p/7905094.html
>>> foo = [2, 18, 9, 22, 17, 24, 8, 12, 27]
>>>
>>> print filter(lambda x: x % 3 == 0, foo)
[18, 9, 24, 12, 27]
>>>
>>> print map(lambda x: x * 2 + 10, foo)
[14, 46, 28, 54, 44, 58, 26, 34, 64]
>>>
>>> print reduce(lambda x, y: x + y, foo)
139

4、zip函式(參考資料[3])

zip()是Python的一個內建函式,接受可迭代的物件作為引數,將物件中對應的元素打包成一個個tuple,然後返回由這些tuples組成的list。若傳入引數的長度不等,則返回list的長度和引數中長度最短的物件相同。利用*號操作符,可以將list unzip(解壓)。

兩個例子:

>>> a = [1,2,3]
>>> b = [4,5,6]
>>> c = [4,5,6,7,8]
>>> zipped = zip(a,b)

[(1, 4), (2, 5), (3, 6)]
>>> zip(a,c)
[(1, 4), (2, 5), (3, 6)]
>>> zip(*zipped)
[(1, 2, 3), (4, 5, 6)]

 二維矩陣變換(矩陣的行列互換)

比如我們有一個由列表描述的二維矩陣 a = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] 通過python列表推導的方法,如下:

print [[row[col] for row in a] for col in range(len(a[0]))]
[[1, 4, 7], [2, 5, 8], [3, 6, 9]]

另一種方法利用zip函式:

>>> a = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>> zip(*a)
[(1, 4, 7), (2, 5, 8), (3, 6, 9)]
>>> map(list,zip(*a))
[[1, 4, 7], [2, 5, 8], [3, 6, 9]]

 這種方法速度更快但也更難以理解,將list看成tuple解壓,恰好得到我們“行列互換”的效果,再通過對每個元素應用list()函式,將tuple轉換為list。

參考