版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第10章函數(shù)式編程主講夏敏捷什么是函數(shù)式編程函數(shù)式編程——FunctionalProgramming,是一種編程的基本風(fēng)格,也就是構(gòu)建程序結(jié)構(gòu)的方式。函數(shù)式編程雖然也可以歸結(jié)到面向過程的程序設(shè)計(jì),但其思想更接近數(shù)學(xué)計(jì)算,也就是可以使用表達(dá)式編程。函數(shù)式編程的一個(gè)特點(diǎn)就是,允許把函數(shù)本身作為參數(shù)傳入另一個(gè)函數(shù),還允許返回一個(gè)函數(shù)。Python對函數(shù)式編程提供部分支持。由于Python允許使用變量,因此,Python不是純函數(shù)式編程語言。10.1高階函數(shù)1.高階函數(shù)概念高階函數(shù)它是可以將其他函數(shù)作為參數(shù)或返回結(jié)果的函數(shù)。例如,定義一個(gè)簡單的高階函數(shù):defadd(x,y,f):returnf(x)+f(y)
add(-5,9,abs)#abs(-5)+abs(9)add(65,66,chr)#AB10.1高階函數(shù)1.返回函數(shù)高階函數(shù)除了可以接受函數(shù)作為參數(shù)外,還可以把函數(shù)作為結(jié)果值返回。defcalc_sum(*args):ax=0forninargs:ax=ax+nreturnaxdeflazy_sum(*args):
defsum():ax=0forninargs:ax=ax+nreturnax
returnsum>>>f=lazy_sum(1,3,5,7,9)>>>f<functionlazy_sum.<locals>.sumat0x101c6ed90>>>>f()25當(dāng)lazy_sum返回函數(shù)sum時(shí),相關(guān)參數(shù)和變量都保存在返回的函數(shù)中,這種稱為閉包(Closure)閉包y=ax+b編寫函數(shù)計(jì)算y的值。defline_conf(a,b):defline(x):returna*x+breturnline>>>line_one=line_conf(3,4)>>>line_two=line_conf(4,6)>>>line_one(5)#結(jié)果19>>>line_two(5)#結(jié)果26上述代碼中l(wèi)ine_conf是外部函數(shù),a、b是它的參數(shù)。line(x)是內(nèi)部函數(shù),x是它的參數(shù)。在line(x)的內(nèi)部通過外部函數(shù)的a、b確定閉包最終形式。閉包具有提過代碼可復(fù)用性的作用。10.2Python函數(shù)式編程常用的函數(shù)1.map()函數(shù)map()是Python內(nèi)置的高階函數(shù),有2個(gè)參數(shù),一個(gè)是函數(shù)f(),一個(gè)是列表list,并通過把函數(shù)f()依次作用在list的每個(gè)元素上,得到一個(gè)新的list作為map()函數(shù)的返回結(jié)果。deff(x):returnx*xlist1=map(f,[1,2,3,4,5,6,7,8,9])print(list(list1))[1,4,9,10,25,36,49,64,81]10.2Python函數(shù)式編程常用的函數(shù)1.map()函數(shù)map()不僅僅可以處理只包含數(shù)值的list,事實(shí)上它可以處理包含任意類型的list,只要傳入的函數(shù)f可以處理這種數(shù)據(jù)類型。list1=[2,4,6,8,10]list2=map(lambdax:x**2,list1)foreinlist2:print(e,end=",")#結(jié)果是:4,16,36,64,100,list1=["china","japan","hello"]list2=map(lambdax:x.title(),list1)#title()首字母大小foreinlist2:print(e,end=",")#結(jié)果是:China,Japan,Hello,10.2Python函數(shù)式編程常用的函數(shù)2.reduce()函數(shù)reduce()函數(shù)接收的參數(shù)和map()類似,一個(gè)函數(shù)f(),一個(gè)列表list,但reduce()傳入的函數(shù)f()必須接收兩個(gè)參數(shù)。reduce()對列表list的每個(gè)元素反復(fù)調(diào)用函數(shù)f(),并返回最終結(jié)果值。fromfunctoolsimportreducedeff(x,y):returnx+yreduce()還可以接收第3個(gè)可選參數(shù),作為計(jì)算的初始值。reduce(f,[1,3,5,7,9],100)結(jié)果將變?yōu)?25。reduce(f,[1,3,5,7,9])結(jié)果為25。10.2Python函數(shù)式編程常用的函數(shù)3.filter()函數(shù)filter()函數(shù)接收一個(gè)函數(shù)f()和一個(gè)list,這個(gè)函數(shù)f()的作用是對每個(gè)元素進(jìn)行判斷,返回True或False,filter()根據(jù)判斷結(jié)果自動(dòng)過濾掉不符合條件的元素,返回由符合條件元素組成的新list。defis_odd(x):returnx%2==1利用filter()過濾掉偶數(shù):filter(is_odd,[1,4,6,7,9,12,17])#結(jié)果[1,7,9,17]10.2Python函數(shù)式編程常用的函數(shù)4.zip()函數(shù)zip()函數(shù)以一系列列表作為參數(shù),將列表中對應(yīng)的元素打包成一個(gè)個(gè)元組,然后返回由這些元組組成的列表。a=[1,2,3]b=[4,5,6]zipped=zip(a,b)forelementinzipped:print(element)(1,4)(2,5)(3,6)10.2Python函數(shù)式編程常用的函數(shù)5.sorted()函數(shù)Python內(nèi)置的sorted()函數(shù)可對list進(jìn)行排序:>>>sorted([36,5,12,9,21])#默認(rèn)升序,所以結(jié)果是[5,9,12,21,36]但sorted()也是一個(gè)高階函數(shù),Python3.7中它的格式如下:sorted(list,key=None,reverse=False)key指定的函數(shù)將作用于list的每個(gè)元素上,并根據(jù)key函數(shù)返回的結(jié)果排序。sorted([36,5,-12,9,-21],key=abs)#結(jié)果是[5,9,-12,-21,36]students=[('john','A',15),('jane','B',12),('dave','B',10)]sorted(students,key=lambdas:s[2])#按照年齡來排序10.2Python函數(shù)式編程常用的函數(shù)5.sorted()函數(shù)Python內(nèi)置的sorted()函數(shù)可對list進(jìn)行排序:>>>sorted([36,5,12,9,21])#默認(rèn)升序,所以結(jié)果是[5,9,12,21,36]但sorted()也是一個(gè)高階函數(shù),Python3.7中它的格式如下:sorted(list,key=None,reverse=False)key指定的函數(shù)將作用于list的每個(gè)元素上,并根據(jù)key函數(shù)返回的結(jié)果排序。sorted([36,5,-12,9,-21],key=abs)#結(jié)果是[5,9,-12,-21,36]students=[('john','A',15),('jane','B',12),('dave','B',10)]sorted(students,key=lambdas:s[2])#按照年齡來排序10.3迭代器迭代器是訪問集合內(nèi)元素的一種方式。迭代器對象從序列(列表、元組、字典、集合)的第一個(gè)元素開始訪問,直到所有的元素都被訪問一遍后結(jié)束。迭代器不能回退,只能往前進(jìn)行迭代。使用內(nèi)建函數(shù)iter(iterable)可以獲取序列的迭代器對象,方法如下:
迭代器對象=iter(序列對象)使用next()函數(shù)可以獲取迭代器的下一個(gè)元素,如下:next(迭代器對象)list=['china','Japan',333]it=iter(list)#獲取迭代器對象print(next(it))print(next(it))print(next(it))chinaJapan33310.4普通編程方式與函數(shù)式編程的對比【例10-2】以普通編程方式計(jì)算列表元素中正數(shù)之和。list=[2,-6,11,-7,8,15,-14,-1,10,-13,18]sum=0foriinrange(len(list)):iflist[i]>0:sum+=list[i]print(sum)fromfunctoolsimportreducelist=[2,-6,11,-7,8,
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 三明市2027年高三第二次診斷性檢測物理試卷(含答案解析)
- 南充市2026-2027學(xué)年高考物理考前最后一卷預(yù)測卷(含答案解析)
- 2026年后勤科上半年醫(yī)院保障總結(jié)
- 工廠設(shè)備運(yùn)維主管2026年二季度設(shè)備故障清零總結(jié)
- 大風(fēng)天氣戶外設(shè)施安全排查課件
- 臺(tái)灣省2026年中考物理試卷附同步解析
- 百草枯中毒病人的護(hù)理
- 金堂縣康復(fù)產(chǎn)業(yè)發(fā)展
- 新生兒紅臀不同程度護(hù)理
- 老年膝關(guān)節(jié)痛護(hù)理常規(guī)
- 2026年危化品從業(yè)人員安全考試題庫及答案
- 教育機(jī)構(gòu)教室改造項(xiàng)目方案
- 護(hù)工清潔護(hù)理中的病人隱私保護(hù)
- 物業(yè)催收管理費(fèi)獎(jiǎng)懲制度
- 2026年生豬屠宰檢疫規(guī)程測試題及答案
- 降壓藥相關(guān)知識(shí)
- 2026年物流運(yùn)輸無人機(jī)標(biāo)準(zhǔn)作業(yè)指南
- GB/T 13471-2025節(jié)能項(xiàng)目經(jīng)濟(jì)效益計(jì)算與評價(jià)方法
- 2025藥品委托生產(chǎn)合同范本
- DB3401∕T 232-2021 物業(yè)服務(wù)檔案管理規(guī)范
- 基坑護(hù)坡水泥毯施工方案
評論
0/150
提交評論