版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、21-4 匿名函數(shù)及高階函數(shù)CONTENTS目 錄 1匿名函數(shù)map()23reduce()filter()45sorted()使用Python寫一些執(zhí)行腳本時(shí),使用匿名函數(shù)可以省去定義函數(shù)的過(guò)程,讓代碼更加精簡(jiǎn)。對(duì)于一些抽象的,不會(huì)別的地方再?gòu)?fù)用的函數(shù),有時(shí)候給函數(shù)起個(gè)名字也挺麻煩,使用匿名函數(shù)不需要考慮命名的問(wèn)題,并且可以讓代碼更容易理解。匿名函數(shù)使用關(guān)鍵字lambda來(lái)定義,語(yǔ)法格式:lambda args:expression20.4.1匿名函數(shù)20.4.1 匿名函數(shù)冒號(hào)前是參數(shù),可以有多個(gè),用逗號(hào)隔開,冒號(hào)右邊可以是任意表達(dá)式,但不能是語(yǔ)句,例如不能是print。由于匿名函數(shù)沒(méi)有名稱
2、,不能直接調(diào)用,需要賦值給一個(gè)對(duì)象,然后依靠此對(duì)象來(lái)調(diào)用: a,b = 3,4 f1 = lambda x,y:x+y print f1(a,b)7上述代碼的第二行等價(jià)于: def f1(x,y). return x+y匿名函數(shù)的主要意義在于函數(shù)速寫,它也常常在map()、reduce()等高階函數(shù)中作為參數(shù)來(lái)使用。map()函數(shù)和接下來(lái)要介紹的其他幾個(gè)函數(shù)都是高階函數(shù)。高階函數(shù)的定義:函數(shù)的參數(shù)(同時(shí)也是函數(shù)要處理的對(duì)象)是其他函數(shù)。map()函數(shù)接收兩個(gè)參數(shù),一個(gè)是函數(shù),一個(gè)是序列,map將傳入的函數(shù)依次作用到序列的每個(gè)元素,并把結(jié)果作為新的列表返回。函數(shù)原型如下:map(function
3、, iterable, .)在map()的參數(shù)中,function是一個(gè)處理函數(shù), iterable為一個(gè)或多個(gè)可迭代對(duì)象。map()會(huì)根據(jù)提供的函數(shù)對(duì)指定序列做映射,即以參數(shù)序列中的每一個(gè)元素調(diào)用function函數(shù),返回包含每次function函數(shù)返回值的新列表。有一點(diǎn)需要注意的是,Python2返回列表,Python3返回一個(gè)map對(duì)象,你可以用for循環(huán)迭代它,取出其中的值。21.4.2map()21.4.2 map()map( f (x), list)123456789list:149162536496481return:f (x) = x2 假設(shè)我們有一個(gè)函數(shù)f(x)=x2,要把這
4、個(gè)函數(shù)作用在一個(gè)包含數(shù)字19的列表對(duì)象上,用高階函數(shù)map()來(lái)實(shí)現(xiàn): def foo(x): return x * x map(foo, 1, 2, 3, 4, 5, 6, 7, 8, 9)1, 4, 9, 16, 25, 36, 49, 64, 8121.4.2 map()map()函數(shù)不改變?cè)械牧斜?,而是返回一個(gè)新的列表,利用map()函數(shù),可以把一個(gè)列表轉(zhuǎn)換為另一個(gè)列表,只需要傳入轉(zhuǎn)換函數(shù)。傳入的函數(shù)可以是匿名函數(shù),因此上面的代碼可以寫成以下形式: map(lambda x : x * x, 1, 2, 3, 4, 5, 6, 7, 8, 9)1, 4, 9, 16, 25, 36,
5、 49, 64, 8121.4.2 map()由于列表包含的元素可以是任何類型,因此,map()不僅僅可以處理只包含數(shù)值的列表,事實(shí)上它可以處理包含任意類型的列表,只要確保傳入的函數(shù)可以處理這種數(shù)據(jù)類型即可。因此,我們不但可以計(jì)算簡(jiǎn)單的f(x)=x2,還可以計(jì)算任意復(fù)雜的函數(shù),比如,把這個(gè)列表中所有的元素由數(shù)字轉(zhuǎn)為字符串,只需要一行代碼: map(str, 1, 2, 3, 4, 5, 6, 7, 8, 9)1, 2, 3, 4, 5, 6, 7, 8, 9reduce()函數(shù)也是Python內(nèi)建的一個(gè)高階函數(shù)。reduce()函數(shù)會(huì)對(duì)參數(shù)序列中元素進(jìn)行累積。函數(shù)將一個(gè)數(shù)據(jù)集合(鏈表,元組等)
6、中的所有數(shù)據(jù)進(jìn)行下列操作:用傳給reduce中的函數(shù)function(有兩個(gè)參數(shù))先對(duì)集合中的第1、2個(gè)元素進(jìn)行操作,得到的結(jié)果再與第三個(gè)數(shù)據(jù)用function函數(shù)運(yùn)算,最后得到一個(gè)結(jié)果。函數(shù)原型如下:reduce(function, iterable, initializer)參數(shù)function是用于處理的函數(shù);iterable為可迭代對(duì)象;initializer是可選的,為初始參數(shù),如果提供了initializer,就先用initializer和數(shù)據(jù)集中的第1個(gè)元素進(jìn)行操作。返回值是函數(shù)計(jì)算結(jié)果。21.4.3reduce()21.4.3 reduce()reduce()函數(shù)接收的參數(shù)和m
7、ap()類似,但行為和map()不同,reduce()把一個(gè)函數(shù)作用在一個(gè)序列x1, x2, x3.上,這個(gè)函數(shù)必須接收兩個(gè)參數(shù),reduce把結(jié)果繼續(xù)和序列的下一個(gè)元素做累積計(jì)算,其效果就是:reduce(f, x1, x2, x3, x4) 等價(jià)于 f(f(f(x1, x2), x3), x4)比方說(shuō)對(duì)一個(gè)序列求累計(jì)乘積,就可以用reduce實(shí)現(xiàn)。下面是利用reduce()求階乘結(jié)果的例子:a = 1n = input(Enter a Number(n=1): )if n=1: a = reduce(lambda x,y: x*y, range(1, n+1)print a執(zhí)行結(jié)果Ente
8、r a Number(n=1): 672021.4.3 reduce()多了解reduce函數(shù)后,我們會(huì)發(fā)現(xiàn)它非常使用且方便,比如要把序列1, 3, 5, 7, 9變換成單一的整數(shù)13579,reduce也可以派上用場(chǎng): def fn(x, y): return x * 10 + y reduce(fn, 1, 3, 5, 7, 9)1357921.4.3 reduce()考慮到字符串str也是一個(gè)序列,對(duì)上面的例子稍加改動(dòng),配合map(),我們也可以寫出把str轉(zhuǎn)換為int的函數(shù): def fn(x, y): return x * 10 + y def char2num(s): return
9、 0: 0, 1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9s reduce(fn, map(char2num, 13579)1357921.4.3 reduce()整理成一個(gè)單一的轉(zhuǎn)換函數(shù)就是:def str2int(s): if s.isdigit(): def fn(x, y): return x * 10 + y def char2num(s): return 0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9s return reduce(fn, map(char2num, s) else: pri
10、nt Need a numeric string.也就是說(shuō),假設(shè)Python沒(méi)有提供int()函數(shù),你完全可以自己寫一個(gè)把字符串轉(zhuǎn)化為整數(shù)的函數(shù),而且非常簡(jiǎn)單。注意,reduce()函數(shù)在Python2是內(nèi)建函數(shù),從Python3開始移到了functools模塊。Python內(nèi)建的filter()函數(shù)用于過(guò)濾序列。和map()類似,filter()也接收一個(gè)函數(shù)和一個(gè)序列。和map()不同的時(shí),filter()把傳入的函數(shù)依次作用于每個(gè)元素,然后根據(jù)返回值是True還是False決定保留還是丟棄該元素。函數(shù)原型如下:filter(function, iterable)function為判斷函數(shù)
11、,iterable為可迭代對(duì)象。對(duì)于其返回值,Python 2中返回的是過(guò)濾后的列表,而Python 3中返回到是一個(gè)可迭代的filter類,相對(duì)Python2提升了性能,可以節(jié)約內(nèi)存。21.4.4filter()21.4.4 filter()下面舉個(gè)例子,在一個(gè)list中,刪掉偶數(shù),只保留奇數(shù): def is_odd(n):. return n % 2 = 1 filter(is_odd, 1, 2, 4, 5, 6, 9, 10, 15)1, 5, 9, 15再舉例把一個(gè)序列中的空字符串刪掉: def not_empty(s):. return s and s.strip() filter
12、(not_empty, A, , B, None, C, )A, B, C可見用filter()這個(gè)高階函數(shù),關(guān)鍵在于正確實(shí)現(xiàn)一個(gè)“篩選”函數(shù)。排序也是在程序中經(jīng)常用到的算法。無(wú)論使用冒泡排序還是快速排序,排序的核心是比較兩個(gè)元素的大小。如果是數(shù)字,我們可以直接比較,但如果是字符串或者兩個(gè)字典呢?直接比較數(shù)學(xué)上的大小是沒(méi)有意義的,因此,比較的過(guò)程必須通過(guò)函數(shù)抽象出來(lái)。通常規(guī)定,對(duì)于兩個(gè)元素x和y,如果認(rèn)為x y,則返回1,這樣,排序算法就不用關(guān)心具體的比較過(guò)程,而是根據(jù)比較結(jié)果直接排序。21.4.5sorted()21.4.5 sorted()Python內(nèi)置的sorted()函數(shù)對(duì)所有可迭代
13、的對(duì)象進(jìn)行排序操作。函數(shù)原型:sorted(iterable, cmp, key, reverse)iterable:可迭代對(duì)象。cmp:比較的函數(shù),這個(gè)具有兩個(gè)參數(shù),參數(shù)的值都是從可迭代對(duì)象中取出,此函數(shù)必須遵守的規(guī)則為,大于則返回1,小于則返回-1,等于則返回0。key:指定一個(gè)函數(shù),每個(gè)元素先被此函數(shù)處理,然后再參與排序。reverse:排序規(guī)則,reverse = True 降序 ,reverse = False 升序(默認(rèn))。返回值:排序后的列表。21.4.5 sorted()默認(rèn)情況下,對(duì)字符串排序,是按照ASCII的大小比較的,因此所有的大寫字母會(huì)排在所有的小寫字母之前?,F(xiàn)在,我們提出排序應(yīng)該忽略大小寫排序。忽略大小寫來(lái)比較兩個(gè)字符串,實(shí)際上就是先把字符串都變成大寫(或者都變成小寫),再進(jìn)行
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年橋梁經(jīng)濟(jì)分析與投資評(píng)估
- 2026春招:行政專員面試題及答案
- 2026春招:銷售代表真題及答案
- 2026春招:西部航空試題及答案
- 貨運(yùn)安全課件
- 心理咨詢部服務(wù)模式改進(jìn)
- 醫(yī)療信息錄入員禮儀與職業(yè)操守
- 醫(yī)藥銷售代表禮儀培訓(xùn)內(nèi)容
- 醫(yī)療大數(shù)據(jù)與臨床決策支持
- 護(hù)理團(tuán)隊(duì)建設(shè)與護(hù)理文化建設(shè)探索
- DB54∕T 0359-2024 雅江雪牛育肥期飼養(yǎng)管理技術(shù)規(guī)程
- 貴州省貴陽(yáng)市2023-2024學(xué)年高一上學(xué)期期末考試語(yǔ)文試卷(含答案)
- 電氣類儀器儀表使用
- 老年醫(yī)學(xué)發(fā)展與挑戰(zhàn)
- 9.2奉獻(xiàn)社會(huì)我踐行課件-2025-2026學(xué)年統(tǒng)編版 道德與法治 八年級(jí)上冊(cè)
- 煙花爆竹零售店安全生產(chǎn)責(zé)任制
- 2025江蘇蘇州市昆山鈔票紙業(yè)有限公司招聘10人筆試歷年參考題庫(kù)附帶答案詳解
- 商業(yè)中庭防墜網(wǎng)施工方案
- 交付異常應(yīng)急預(yù)案
- 砌體工程監(jiān)理實(shí)施細(xì)則及操作規(guī)范
- GB/T 222-2025鋼及合金成品化學(xué)成分允許偏差
評(píng)論
0/150
提交評(píng)論