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。
參考