匿名函數就是不須要顯示的指定函數,只要運行過一次後就立馬釋放內存空間。編程
主要表現形式爲:app
lambda 形參:具體功能編程語言
def calc(n): return n**n print(calc(10)) #換成匿名函數 calc = lambda n:n**n print(calc(10))
你也許會說,用上這個東西沒感受有毛方便呀, 。。。。呵呵,若是是這麼用,確實沒毛線改進,不過匿名函數主要是和其它函數搭配使用的呢,以下ide
res = map(lambda x:x**2,[1,5,7,4,8]) for i in res: print(i)
輸出
1
25
49
16
64
l=[3,2,100,999,213,1111,31121,333] print(max(l)) dic={'k1':10,'k2':100,'k3':30} print(max(dic)) print(dic[max(dic,key=lambda k:dic[k])])
1.高階函數函數式編程
知足以下兩個特色的任意一個即爲高階函數:函數
(1) 函數的傳入參數是一個函數名spa
(2) 函數的返回值是一個函數名code
def foo():
print("from the foo")
def test(func):
return func
res = test(foo)
res()
foo = test(foo)
foo()
2. 函數式編程:函數式=編程語言定義的函數+數學意義的函數對象
通俗來說,函數式就是用編程語言去實現數學函數。這種函數內對象是永恆不變的,要麼參數是函數,要麼返回值是函數,沒有for和while循環,全部的循環都由遞歸去實現,無變量的賦值(即不用變量去保存狀態),無賦值即不改變。blog
3.
array=[1,3,4,71,2] ret=[] for i in array: ret.append(i**2) print(ret) #若是咱們有一萬個列表,那麼你只能把上面的邏輯定義成函數 def map_test(array): ret=[] for i in array: ret.append(i**2) return ret print(map_test(array)) #若是咱們的需求變了,不是把列表中每一個元素都平方,還有加1,減一,那麼能夠這樣 def add_num(x): return x+1 def map_test(func,array): ret=[] for i in array: ret.append(func(i)) return ret print(map_test(add_num,array)) #能夠使用匿名函數 print(map_test(lambda x:x-1,array)) #上面就是map函數的功能,map獲得的結果是可迭代對象 print(map(lambda x:x-1,range(5))) map函數
4.
from functools import reduce #合併,得一個合併的結果 array_test=[1,2,3,4,5,6,7] array=range(100) #報錯啊,res沒有指定初始值 def reduce_test(func,array): l=list(array) for i in l: res=func(res,i) return res # print(reduce_test(lambda x,y:x+y,array)) #能夠從列表左邊彈出第一個值 def reduce_test(func,array): l=list(array) res=l.pop(0) for i in l: res=func(res,i) return res print(reduce_test(lambda x,y:x+y,array)) #咱們應該支持用戶本身傳入初始值 def reduce_test(func,array,init=None): l=list(array) if init is None: res=l.pop(0) else: res=init for i in l: res=func(res,i) return res print(reduce_test(lambda x,y:x+y,array)) print(reduce_test(lambda x,y:x+y,array,50)) reduce函數
5.
#電影院彙集了一羣看電影bb的傻逼,讓咱們找出他們 movie_people=['alex','wupeiqi','yuanhao','sb_alex','sb_wupeiqi','sb_yuanhao'] def tell_sb(x): return x.startswith('sb') def filter_test(func,array): ret=[] for i in array: if func(i): ret.append(i) return ret print(filter_test(tell_sb,movie_people)) #函數filter,返回可迭代對象 print(filter(lambda x:x.startswith('sb'),movie_people)) filter函數
#固然了,map,filter,reduce,能夠處理全部數據類型 name_dic=[ {'name':'alex','age':1000}, {'name':'wupeiqi','age':10000}, {'name':'yuanhao','age':9000}, {'name':'linhaifeng','age':18}, ] #利用filter過濾掉千年王八,萬年龜,還有一個九千歲 def func(x): age_list=[1000,10000,9000] return x['age'] not in age_list res=filter(func,name_dic) for i in res: print(i) res=filter(lambda x:x['age'] == 18,name_dic) for i in res: print(i) #reduce用來計算1到100的和 from functools import reduce print(reduce(lambda x,y:x+y,range(100),100)) print(reduce(lambda x,y:x+y,range(1,101))) #用map來處理字符串列表啊,把列表中全部人都變成sb,比方alex_sb name=['alex','wupeiqi','yuanhao'] res=map(lambda x:x+'_sb',name) for i in res: print(i) 總結