廖雪峰讲python高阶函数求导公式_一文读懂Python 高阶函数
高階函數(shù)
將函數(shù)作為參數(shù)傳入,這樣的函數(shù)稱(chēng)為高階函數(shù)。函數(shù)式編程就是指這種高度抽象的編程范式。
變量可以指向函數(shù),函數(shù)的參數(shù)能接收變量,那么一個(gè)函數(shù)就可以接收另一個(gè)函數(shù)作為參數(shù),這種函數(shù)就稱(chēng)之為高階函數(shù)。如下所示:
1 deffun0(x,y,fun):2 return fun(x)*fun(y)3 print(fun0(-9,-10,abs))
1. 高階函數(shù)之map
map(fun, lst),將傳入的函數(shù)變量func作用到lst變量的每個(gè)元素中,并將結(jié)果組成新的列表返回。
1 list1=[0,1,2,3,4,5,6,7,8,9]2
3 list_result=[]4 for i inlist1:5 list_result.append(i*i*i)6 print(list_result)7
8 def cube(x):#求立方
9 return x*x*x10 print(list(map(cube,list1)))11
12
13 list2=[10,11,12,13,14,15,16,17,18,19]14 defmulti(x,y):15 return x*y16
17 #map接收兩個(gè)list,可用于兩個(gè)列表的對(duì)應(yīng)索引數(shù)據(jù)進(jìn)行操作
18 print(list(map(multi,list1,list2)))
2. 高階函數(shù)之匿名函數(shù)
定義一個(gè)匿名函數(shù)并調(diào)用,定義格式如-->lambda arg1,arg2…:表達(dá)式
1 f=lambda x,y:x+y2 print(f(10,20))3
4 #不需要顯式地定義函數(shù),直接傳入匿名函數(shù)更方便
5 print(list(map(lambda x:x*x*x,list1)))
3. 高階函數(shù)之reduce
reduce把一個(gè)函數(shù)作用在一個(gè)序列[x1, x2, x3, …]上,這個(gè)函數(shù)必須接收兩個(gè)參數(shù),reduce把結(jié)果繼續(xù)和序列的下一個(gè)元素做累積計(jì)算。
1 from functools importreduce2 list1=[1,3,5,7,9] #如何讓列表里面的值變成一個(gè)數(shù)字13579輸出
3 deffun(x,y):4 return x*10+y5 print(reduce(fun,list1))6 print(reduce(lambda x,y:x*10+y,list1))#利用lambda來(lái)實(shí)現(xiàn)
7
8 print(reduce(lambda x,y:x+y,range(1,101)))#從1+2+...+99+100的總和
4. 高階函數(shù)之filter
filter() 函數(shù)用于過(guò)濾序列,過(guò)濾掉不符合條件的元素,返回由符合條件元素組成的新列表。
1 deffun2(x):2 return x%2==03 list2=[1,2,3,4,5,6,7,8,9]4 print(list(filter(fun2,list2)))5
6 print(list(filter(fun2, range(1, 101))))#輸出1到100的偶數(shù)
7 print(list(filter(lambda x:x%2==0,list2)))#利用lambda來(lái)實(shí)現(xiàn)
8
9 #獲取非空字符串函數(shù)
10 deffun3():11 list1 = ["tony", "is", "good", "man", " ", "hello", " "]12 for el inlist1:13 if(el andel.strip()):14 print(el)15fun3()16
17 #使用filter實(shí)現(xiàn)fun3的功能
18 defis_not_null(str1):19 return str1 andstr1.strip()20 list3=["tony","is","good","man"," ","hello"," "]21 print(list(filter(is_not_null,list3)))
5. 高階函數(shù)之裝飾器
1 importtime2 def waste_time(func): #用于計(jì)算函數(shù)執(zhí)行的耗時(shí)
3 def function(*args,**kwargs):4 start_time=time.time()5 result=func(*args,**kwargs)6 end_time=time.time()7 spend=end_time-start_time8 print("函數(shù)%s 總共耗時(shí)%.3f秒:"%(func.__name__,spend))9 returnresult10 returnfunction11
12@waste_time13 defabc():14 print("aaa")15abc()16
17 def get_log(func): #能裝飾的方法添加日志輸出
18 importtime19 def wrapper(*args, **kw):20 print(str(time.asctime())+'call %s():' % func.__name__)21 return func(*args, **kw)22 returnwrapper23
24@get_log25 defabd():26 print("bbb")27 abd()
6. 高階函數(shù)之 retrun function(返回函數(shù))
1@waste_time2 def get_dict(**kwargs):3 defgetjson():4 jsons=""
5 for key,value inkwargs.items():6 jsons+=key+"="+str(value)+"&"
7 returnjsons8 returngetjson9
10
11 print(get_dict(name='tony',age=33))12 f=get_dict(name='tony',age=33)13 print(f())14 print(get_dict(name='tony',age=33)())
7. 高階函數(shù)之sorted排序函數(shù)
1 num_list=[34,55,2,3,444,500]2 print(sorted(num_list)) #默認(rèn)升序
3 print(sorted(num_list,reverse=True)) #reverse=True表示降序
4
5 #對(duì)字符串ASCII A=65 a=97進(jìn)行排序
6 str_list=['ac','aa','AB','d','c']7 print(sorted(str_list))8 print(sorted(str_list,reverse=True))9
10 #用key來(lái)接收指定函數(shù)來(lái)進(jìn)行自定義排序
11 str_list=['ac','aa','AB','d','c']12 print(sorted(str_list,key=str.lower)) #不考慮大小寫(xiě)
13
14 num_list=[34,55,2,3,444,500,-599,-222]15 print(sorted(num_list,key=abs)) #用絕對(duì)值進(jìn)行排序
16
17 classTester:18 def __init__(self,age,name):19 self.age=age20 self.name=name21
22 t1=Tester(10,'tony')23 t2=Tester(20,'jack')24 t3=Tester(30,'tom')25
26 result=list(sorted([t1,t2,t3],key=lambda x:x.age)) #針對(duì)對(duì)象實(shí)例進(jìn)行排序,指定了年齡
27 for test inresult:28 print(test.name,test.age)
8. 高階函數(shù)之閉包
閉包的定義?閉包本質(zhì)上就是一個(gè)函數(shù)
如何創(chuàng)建閉包?
函數(shù)要嵌套(有內(nèi)外部函數(shù))
內(nèi)部函數(shù)使用外部函數(shù)的變量
外部函數(shù)返回內(nèi)部函數(shù)的名稱(chēng)
如何使用閉包?典型的使用場(chǎng)景是裝飾器的使用。
global與nonlocal的區(qū)別:
global可以改變?nèi)肿兞?#xff0c;同時(shí)可以定義新的全局變量;
nonlocal只能改變外層函數(shù)變量,不能定義新的外層函數(shù)變量,并且nonlocal也不能改變?nèi)肿兞俊?/p>
global關(guān)鍵字可以用在任何地方,包括最上層函數(shù)中和嵌套函數(shù)中;
nonlocal關(guān)鍵字只能用于嵌套函數(shù)中,并且外層函數(shù)中必須定義了相應(yīng)的局部變量,否則會(huì)發(fā)生錯(cuò)誤。
簡(jiǎn)單的使用如下:
1 defoutFun(arg1):2 definFun(arg2):3 nonlocal arg1#nonlocal關(guān)鍵字用來(lái)在函數(shù)或其他作用域中使用外層(非全局)變量。
4 arg1+=200
5 return arg1*arg26 returninFun7 infun=outFun(100)#調(diào)用外部函數(shù),傳入?yún)?shù),返回是內(nèi)部函數(shù)
8 result=infun(300)#調(diào)用內(nèi)部函數(shù),傳入?yún)?shù)
9 print("the result is:",result)10
11 #使用閉包求給function計(jì)算耗時(shí)(上面的內(nèi)容已經(jīng)提到)代碼如下:
12 importtime13 def waste_time(func): #用于計(jì)算函數(shù)執(zhí)行的耗時(shí)
14 def function(*args,**kwargs):15 start_time=time.time()16 result=func(*args,**kwargs)17 end_time=time.time()18 spend=end_time-start_time19 print("函數(shù)%s 總共耗時(shí)%.3f秒:"%(func.__name__,spend))20 returnresult21 return function
9. 高階函數(shù)之偏函數(shù)
偏函數(shù)主要輔助原函數(shù),作用其實(shí)和原函數(shù)差不多,不同的是,我們要多次調(diào)用原函數(shù)的時(shí)候,有些參數(shù),我們需要多次手動(dòng)的去提供值。
而偏函數(shù)便可簡(jiǎn)化這些操作,減少函數(shù)調(diào)用,主要是將一個(gè)或多個(gè)參數(shù)預(yù)先賦值,以便函數(shù)能用更少的參數(shù)進(jìn)行調(diào)用。
我們?cè)賮?lái)看一下偏函數(shù)的定義:
類(lèi)func = functools.partial(func, *args, **keywords)
我們可以看到,partial 一定接受三個(gè)參數(shù),從之前的例子,我們也能大概知道這三個(gè)參數(shù)的作用。簡(jiǎn)單介紹下:
func: 需要被擴(kuò)展的函數(shù),返回的函數(shù)其實(shí)是一個(gè)類(lèi) func 的函數(shù)
*args: 需要被固定的位置參數(shù)
**kwargs: 需要被固定的關(guān)鍵字參數(shù)
1 def add(*args, **kwargs):2 for n in args:#打印位置參數(shù)
3 print(n)4 print("-"*20)5 for k, v in kwargs.items():#打印關(guān)鍵字參數(shù)
6 print('%s:%s' %(k, v))7
8 #普通調(diào)用
9 add(1, 2, 3, v1=10, v2=20)10
11 #偏函數(shù)調(diào)用
12 from functools importpartial13 add_fun=partial(add,100,k1=200,k2=300)14 add_fun(1, 2, 3, v1=10, v2=20)
總結(jié)
本文是對(duì)Python 高階函數(shù)相關(guān)知識(shí)的分享,主題內(nèi)容總結(jié)如下:
初識(shí)高階函數(shù)
高階函數(shù)之map
高階函數(shù)之匿名函數(shù)
高階函數(shù)之reduce
高階函數(shù)之filter
高階函數(shù)之裝飾器
高階函數(shù)之 retrun function(返回函數(shù))
高階函數(shù)之sorted排序函數(shù)
高階函數(shù)之閉包
高階函數(shù)之偏函數(shù)
歡迎關(guān)注【無(wú)量測(cè)試之道】公眾號(hào),回復(fù)【領(lǐng)取資源】,
Python編程學(xué)習(xí)資源干貨、
Python+Appium框架APP的UI自動(dòng)化、
Python+Selenium框架Web的UI自動(dòng)化、
Python+Unittest框架API自動(dòng)化、
資源和代碼 免費(fèi)送啦~
文章下方有公眾號(hào)二維碼,可直接微信掃一掃關(guān)注即可。
備注:我的個(gè)人公眾號(hào)已正式開(kāi)通,致力于測(cè)試技術(shù)的分享,包含:大數(shù)據(jù)測(cè)試、功能測(cè)試,測(cè)試開(kāi)發(fā),API接口自動(dòng)化、測(cè)試運(yùn)維、UI自動(dòng)化測(cè)試等,微信搜索公眾號(hào):“無(wú)量測(cè)試之道”,或掃描下方二維碼:
添加關(guān)注,讓我們一起共同成長(zhǎng)!
總結(jié)
以上是生活随笔為你收集整理的廖雪峰讲python高阶函数求导公式_一文读懂Python 高阶函数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 10 月 10 日发行,《极限竞速:赛车
- 下一篇: 扎克伯格:我已做好战斗准备,马斯克说了不