8.1 lambda函數
作用及意義:
1.沒必要專門定義函數,給函數起名,起到精簡的效果
2.簡化代碼的可讀性
def ds(x): return 2 * x + 1 ds(5) ---11 g = lambda x : 2 * x + 1 g(5) ---11 def add(x,y): return x + y add(3,4) ---7 g = lambda x,y : x + y g(3,4) ---7
常用的內置函數(BIF函數)
①
filter() ------過濾器
list (filter(None,[1,0,False,True])) ---[1, True] #把任何非True的內容給過濾掉了 #利用filter寫一個奇數的過濾器 def odd(x): return x % 2 temp = range(10) show = filter(odd,temp) list(show) ---[1,3,5,7,9] list (filter(lambda x : x % 2 , range(10))) ---[1,3,5,7,9] def aaa(x): return x % 2 == 1 ret = list(filter(aaa, [1, 2, 54, 3, 6, 8, 17, 9])) print(ret) ---[1, 3, 17, 9]
l = [15, 24, 31, 14] def func(x): return x > 20 print(list(filter(func,l))) print(list(filter(lambda x: x > 20, l))) # 比較兩者差異
②map() -----映射
map有兩個參數,一個函數,一個可迭代序列,
將序列中的每一個元素作為函數參數進行運算加工,
直到可迭代序列中的每個元素加工完畢返回所有加工后的元素構成的新序列。
list(map(lambda x : x * 2, range(10))) ---[0, 2, 4, 6, 8, 10, 12, 14, 16, 18
l = [1, 2, 3, 4, 5] def pow2(x): return x*x print(list(map(pow2, l))) ---[1, 4, 9, 16, 25]
l = [1, 2, 3, 4] def func(x): return x*x print(list(map(func, l))) print(list(map(lambda x : x*x, l))) # 比較兩者差異
# 多個數組進行相加
li = [11, 22, 33] sl = [1, 2, 3] new_list = map(lambda a, b: a + b, li, sl) print(new_list)
---[12, 24, 36] # 這里在py2中結果是這個,在py3中是一個可迭代對象,需要調用list函數
③ reduce()函數
也是存在兩個參數,一個函數,一個可迭代序列,但是函數必須接收兩個參數。作用是對於序列內所有元素進行累積操作
from functools import reduce # 在py2中不需要從functools中導入,但是在py3中需要,他已經不屬於一個內置函數,屬於一個高階函數 lst = [11,22,33] func2 = reduce(lambda arg1,arg2:arg1+arg2,lst) print('func2:', func2) ---func2: 66
例題:
# 現有兩個元組(('a'),('b')),(('c'),('d')),請使用python中匿名函數生成列表[{'a':'c'},{'b':'d'}] # 方法一 t1 = (('a'), ('b')) t2 = (('c'), ('d')) print(list(zip(t1, t2))) # [('a', 'c'), ('b', 'd')] print(list(map(lambda t: {t[0], t[1]}, zip(t1, t2)))) # [{'a', 'c'}, {'d', 'b'}] # 方法二 print(list([{i,j} for i,j in zip(t1,t2)])) # [{'a', 'c'}, {'d', 'b'}] #方法三 func = lambda t1,t2:[{i,j} for i,j in zip(t1,t2)] ret = func(t1,t2) print(ret) # [{'a', 'c'}, {'d', 'b'}]