五、Lambda表達式與filter、map、reduce函數
一、lambda表達式
Lambda表達式並不是Python中特有的,很多語言中都有,例如:Jave、C++、C#中都有。
根據百度百科中對“Lambda 表達式”(lambda expression)的解釋,它是一個匿名函數,Lambda表達式基於數學中的λ演算得名,直接對應於其中的lambda抽象(lambda abstraction),是一個匿名函數,即沒有函數名的函數。
Python中的Lambda表達式是一類特殊的定義函數的形式,使用它可以定義一個匿名函數。與其它語言不同,Python的Lambda表達式的函數體只能有單獨的一條語句,也就是返回值表達式語句。其語法如下:
lambda 形參列表 : 函數返回值表達式語句
注意:lambda是一個表達式而不是一個語句。lambda表達式可以接收任意多個參數 (包括可選參數) 並且返回單個表達式的值!
1、Python語言構建一個函數就是兩種方式def和lambda。下面舉例進行說明:
def add1(a, b):
return a+b
a = 2
b = 3
print("a + b =",add1(a,b))
# 結果爲:
a + b = 5
a = 2
b = 3
add2 = lambda a,b : a+b
print('a + b =',add2(a,b))
# 結果爲:
a + b = 5
print('type(add1(a,b)):',type(add1(a,b)))
print('type(add2):',type(add2))
# 結果爲:
type(add1(a,b)): <class 'int'>
type(add2): <class 'function'> # 可見,Lambda表達式確實是一種函數的表示方式
2、利用lambda表達式快速組建列表
list = lambda x : x ** 2
l= [list(i) for i in range(10)]
print(l)
# 執行結果
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
list = [(lambda n,i = i : i + n) for i in range(10)]
print(list[2](9))
# 執行結果
11
list[2]是第2個數據(從0開始),(9)是向lambda表達式中插入一個參數,另一個參數是是for循環中的i。
當i = 2,n = 9,執行的結果是11。
二、filter函數
格式:filter(function, iterable)
參數:function -- 判斷函數;iterable -- 可迭代對象。
返回值:返回一個迭代器對象
filter() 函數用於過濾序列,過濾掉不符合條件的元素。接收兩個參數,第一個爲函數,第二個爲序列,序列的每個元素作爲參數傳遞給函數進行判斷,返回該序列中使得該函數返回值爲True的那些元素組成的filter對象,如果指定函數爲None,則返回序列中等價於True的元素。
seq = ['foo', 'x41', '?!', '***']
def func(x):
return x.isalnum() #測試是否爲字母或數字
filter(func, seq) #返回filter對象
# <filter object at 0x000000000305D898>
print(list(filter(func, seq))) #把filter對象轉換爲列表
# 執行結果:
['foo', 'x41']
三、map函數
格式:map(func, *iterables)
參數:function -- 函數;iterable -- 一個或多個序列
內置函數map()把一個函數func依次映射到序列或迭代器對象的每個元素上,並返回一個可迭代的map對象作爲結果,map對象中每個元素是原序列中元素經過函數func處理後的結果。
print(list(map(str, range(5))) ) #把列表中元素轉換爲字符串
# 執行結果:
['0', '1', '2', '3', '4']
def add5(v): #單參數函數
return v+5
print(list(map(add5, range(10)))) #把單參數函數映射到一個序列的所有元素
# 執行結果:
[5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
def add(x, y): #可以接收2個參數的函數
return x+y
print(list(map(add, range(5), range(5,10)))) #把雙參數函數映射到兩個序列上
# 執行結果:
[5, 7, 9, 11, 13]
四、reduce函數
格式:reduce(func, sequence[, initial])
參數:function -- 函數,有兩個參數;iterable -- 可迭代對象;initializer -- 可選,初始參數。
返回值:返回函數計算結果
標準庫functools中的函數reduce()可以將一個接收2個參數的函數以迭代累積的方式從左到右依次作用到一個序列或迭代器對象的所有元素上,並且允許指定一個初始值。
from functools import reduce
seq = list(range(1, 10))
print(reduce(lambda x, y: x+y, seq))
# 執行結果:
45
五、Lambda表達式與filter、map、reduce函數
1、lambda表達式與filter函數
# # 讓列表中的偶數輸出到屏幕上
f = filter(lambda x : x % 2 == 0, [0,1,2,3,4,5,6,7,8,9])
for i in f:
print(i)
#執行結果
0
2
4
6
8
2、lambda表達式與map函數
# 讓列表中數字全部乘以2
m = map(lambda x : x * 2, [0,1,2,3,4,5,6,7,8,9])
for i in m:
print(i)
#執行結果
0
2
4
6
8
10
12
14
16
18
3、lambda表達式與reduce函數
# 將列表中數字進行相加
from functools import reduce
r = reduce(lambda x,y : x + y, range(1,101))
print(r)
#執行結果
5050