1.一用而過:lambda
- python的匿名函數寫作lambda,當需要實現一定功能而又不想“大張旗鼓”的def一個函數時,lambda就是最優的選擇。
- 其語法格式一般是這樣的:
f = lambda x: x ** 2 print(f(2))
- lambda函數更廣泛的應用場景在於該匿名函數作爲另一個函數的參數傳遞時,應用就比較合適了,例如,將lambda作爲sort()函數的key參數,就可以實現特定功能的排序。
dict = {'a': 2, 'b': 3, 'c': 5} c = sorted(dict.items(), key=lambda x: x[1]) print(c)
2.智能解壓:zip
- zip函數人如其名,是打包或者解包的函數,接受2個以上可迭代變量,輸出對應位置組成元組後的迭代類型。例如:
a = ['a', 'b', 'c'] b = (4, 6, 9) c = zip(a, b) print(c) print(list(c))
- 也可以接受多於2個輸入可迭代變量,而且如果各迭代變量長度不一致也不會報錯,只是此時返回迭代變量取決於輸入總長度最短的一個。例如:
a = ['a', 'b', 'c', 'd', 'e'] b = (4, 6, 9) c = [True, False, True] d = zip(a, b, c) print(d) print(list(d))
- 與zip打包相對應的用法是解包,即對一個打包形式的元素進行依次解包,並返回多個新的列表。例如:
aZip = (('a', 4, True), ('b', 6, False), ('c', 9, True)) a, b, c = zip(*aZip) print(a) print(b) print(c)
3.一一映射:map
- map函數也正如其取名一樣,是一個將接受的迭代變量依次經過某種映射,並輸出映射後的迭代變量。例如,如果對列表中的某個變量依次完成求值,並返回一個新的列表,則可以應用map:
a = [1, 2, 3, 4] b = map(str, a) print(b) c = list(b) print(c)
這是map函數的一個典型用法:接受2個參數,第一個參數(上例中是str()函數)是一個要作用的函數,第二個參數是可迭代變量。
當第一個函數的參數是是一個多變量函數時,map也可以接受更多的參數。例如:
a = [1, 2, 3, 4] b = [2, 2, 3, 4] c = list(map(lambda x, y: x ** y, a, b)) print(c)
與zip函數中類似,當map裏的函數參數長度不匹配時並不會報錯,只是輸出結果將由最短的決定:
a = [1, 2, 3, 4] b = [2, 2] c = list(map(lambda x, y: x ** y, a, b)) print(c)
4.一夫當關:filter
- 與map函數類似,filter函數也接受一個函數及其變量作爲參數,只是要求這個函數的返回結果是bool型,並用這個bool的結果決定輸出的取捨問題。例如需要對一個輸入列表過濾,要求保留3的倍數:
a = range(10) b = filter(lambda x: x % 3 == 0, a) print(b) c = list(b) print(c)
這裏需注意,當filter的第一個函數返回值不是bool型時不會報錯,只是它會轉化爲bool型判斷,如果判斷結果不是False(python中會判爲False的變量包括0、None、[]等等),則會將其輸出,否則過濾掉:
a = range(10) b = filter(lambda x: x % 3, a) c = list(b) print(c)
5.萬劍歸宗:reduce
- map和filter函數都是多入多出型,實質上是完成了特定的變換或篩選。reduce則是歸約函數,將一系列輸入變量經過特定的函數後轉化爲一個結果輸出。不過可能是由於應用場景有限的原因,reduce在python3中已不再是全局調用函數,必須要從functools包中導入方可使用:
from functools import reduce a = range(5) b = reduce(lambda x, y: x + y, a) print(b)
- reduce函數還可以接受一個可選的初始值作爲參數。應用reduce函數可以實現很多小trick,就看能不能想的到用的出:
from functools import reduce a = 'abcdefg' b = reduce(lambda x, y: y + x, a, 'AA') print(b)