版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、實(shí)用標(biāo)準(zhǔn)文檔1. map()函數(shù)map()是Python內(nèi)置的高階函數(shù),它接收一個(gè)函數(shù)f 和一個(gè)list ,并通過(guò)把函數(shù)f依次作用在 list的每個(gè)元素上,得到一個(gè)新的list并返回。例如,對(duì)于 list 1, 2, 3, 4, 5, 6, 7, 8, 9如果希望把list的每個(gè)元素都作平方,就可以用map()函數(shù):輸出結(jié)果:1,4, 9, 10, 25, 36, 49, 64, 81可以用列表替代print Lx*x fx Ln1亦 i, 4, 9. i&, 2昭 36, 49F G4, Sil注意:map()函數(shù)不改變?cè)械膌ist,而是返回一個(gè)新的list 。利用map()函數(shù),可以把一
2、個(gè)list 轉(zhuǎn)換為另一個(gè)list ,只需要傳入轉(zhuǎn)換函數(shù)。由于list包含的元素可以是任何類(lèi)型,因此,map()不僅僅可以處理只包含數(shù)值的list ,事實(shí)上它可以處理包含任意類(lèi)型的list,只要傳入的函數(shù)f可以處理這種數(shù)據(jù)類(lèi)型。假設(shè)用戶(hù)輸入的英文名字不規(guī)范,沒(méi)有按照首字母大寫(xiě),后續(xù)字母小寫(xiě)的規(guī)則,請(qǐng)利用map()函數(shù),把一個(gè)list (包含若干不規(guī)范的英文名字)變成一個(gè)包含規(guī)范英文名字的list :輸入:adam,LISA,barT輸岀:Adam, Lisa, Bartformat_name(s)函數(shù)接收一個(gè)字符串,并且要返回格式化后的字符串,利用map()函數(shù),就可以輸岀新的list 。參考代
3、碼:def format_ name(s):return s0.upper() + s1: .Io wer()print map(format_ name, adam, LISA, barT)2. reduce()函數(shù)reduce()函數(shù)也是Python內(nèi)置的一個(gè)高階函數(shù)。reduce()函數(shù)接收的參數(shù)和 map()類(lèi)似,一個(gè)函數(shù) f,一個(gè)list ,但行為和map()不同,reduce()傳入的函數(shù)f必須接收兩個(gè)參數(shù),reduce()對(duì)list 的每個(gè)元素反復(fù)調(diào)用函數(shù)f,并返回最終結(jié)果值。例如,編寫(xiě)一個(gè)f函數(shù),接收x和y,返回x和y的和:def f(x, y):return x + y調(diào)用
4、reduce(f, 1,3, 5, 7, 9)時(shí),reduce函數(shù)將做如下計(jì)算:先計(jì)算頭兩個(gè)元素:f(1, 3),結(jié)果為4;再把結(jié)果和第3個(gè)元素計(jì)算:f(4, 5),結(jié)果為9;再把結(jié)果和第4個(gè)元素計(jì)算:f(9, 7),結(jié)果為16;再把結(jié)果和第5個(gè)元素計(jì)算:f(16, 9),結(jié)果為25;由于沒(méi)有更多的元素了,計(jì)算結(jié)束,返回結(jié)果25 o上述計(jì)算實(shí)際上是對(duì)list的所有元素求和。雖然Python內(nèi)置了求和函數(shù)sum(),但是,利用reduce()求和也很簡(jiǎn)單。reduce()還可以接收第3個(gè)可選參數(shù),作為計(jì)算的初始值。如果把初始值設(shè)為100,計(jì)算:reduce(f, 1, 3, 5, 7, 9, 1
5、00)結(jié)果將變?yōu)?25,因?yàn)榈谝惠営?jì)算是:計(jì)算初始值和第一個(gè)元素:f(100, 1),結(jié)果為101。Python內(nèi)置了求和函數(shù)sum(),但沒(méi)有求積的函數(shù),請(qǐng)利用recude()來(lái)求積:輸入:2, 4, 5, 7, 12輸岀:2*4*5*7*12的結(jié)果reduce()接收的函數(shù)f需要兩個(gè)參數(shù),并返回一個(gè)結(jié)果,以便繼續(xù)進(jìn)行下一輪計(jì)算。參考代碼:def prod(x, y):retur n x * yprin t reduce(prod, 2, 4, 5, 7, 12)3. filter() 函數(shù)filter() 函數(shù)是 Python內(nèi)置的另一個(gè)有用的高階函數(shù),filter()函數(shù)接收一個(gè)函數(shù)f
6、和一個(gè)list,這個(gè)函數(shù) f的作用是對(duì)每個(gè)元素進(jìn)行判斷,返回 True或False ,filter() 根據(jù)判斷結(jié)果 自動(dòng)過(guò)濾掉不符合條件的元素,返回由符合條件元素組成的新list。例如,要從一個(gè)list 1,4, 6, 7, 9, 12, 17中刪除偶數(shù),保留奇數(shù),首先,要編寫(xiě)一個(gè)判斷奇數(shù)的函數(shù):def is_odd(x):return x % 2 = 1然后,利用filter()過(guò)濾掉偶數(shù):filter(is_odd, 1,4, 6, 7, 9, 12, 17)結(jié)果:1, 7, 9,17利用filter(),可以完成很多有用的功能,例如,刪除None或者空字符串:def is _no t_
7、empty(s):return s and len (s.strip() 0filter(is_ not_empty, test, N on e, , str, , END)結(jié)果:test,str,END注意:s.strip(rm) 刪除s字符串中開(kāi)頭、結(jié)尾處的rm序列的字符。當(dāng)rm為空時(shí),默認(rèn)刪除空白符(包括n, r, t,),如下:a = 123a.strip()結(jié)果: 123a=tt123 rn a.strip()結(jié)果:123請(qǐng)利用filter() 過(guò)濾岀1100中平方根是整數(shù)的數(shù),即結(jié)果應(yīng)該是:1,4, 9, 16, 25, 36, 49, 64, 81, 100filter()接收的
8、函數(shù)必須判斷岀一個(gè)數(shù)的平方根是否是整數(shù),而math.sqrt()返回結(jié)果是浮點(diǎn)數(shù)。參考代碼:import mathdef is_sqr(x):r = in t(math.sqrt(x)return r*r=xprint filter(is_sqr, ra nge(1, 101)4. 自定義排序函數(shù) sorted()Python內(nèi)置的 sorted()函數(shù)可對(duì)list進(jìn)行排序:sorted(36, 5, 12, 9, 21)5, 9,12, 21, 36但sorted()也是一個(gè)高階函數(shù),它可以接收一個(gè)比較函數(shù)來(lái)實(shí)現(xiàn)自定義排序,比較函數(shù)的定義是,傳入兩個(gè)待比較的元素x, y ,如果x應(yīng)該排在y的
9、前面,返回-1 ,如果x應(yīng)該排在y的后面, 返回1。如果x和y相等,返回0。因此,如果我們要實(shí)現(xiàn)倒序排序,只需要編寫(xiě)一個(gè)reversed_cmp函數(shù):這樣,調(diào)用sorted() 并傳入reversed_cmp就可以實(shí)現(xiàn)倒序排序: sorted(36, 5, 12, 9, 21, reversed_cmp)36, 21, 12, 9, 5|sorted()也可以對(duì)字符串進(jìn)行排序,字符串默認(rèn)按照ASCII大小來(lái)比較: sorted(bob, about, Zoo, Credit)Credit, Zoo, about, bobZoo排在about之前是因?yàn)閆的ASCII碼比a小。對(duì)于比較函數(shù)cmp_
10、ignore_case(s1, s2),要忽略大小寫(xiě)比較,就是先把兩個(gè)字符串都變成大寫(xiě)(或 者都變成小寫(xiě)),再比較。參考代碼:def cmp_ig no re_case(s1, s2):u1 = s1.upper()u2 = s2.upper() |if u1 u2:return 1return 0print sorted(bob, about, Zoo, Credit, cmp_ig no re_case)5. 返回函數(shù)6. Python的函數(shù)不但可以返回int、str、list 、dict等數(shù)據(jù)類(lèi)型,還可以返回函數(shù)!7. 例如,定義一個(gè)函數(shù)f(),我們讓它返回一個(gè)函數(shù)g,可以這樣寫(xiě):8.d
11、ef f():9.print call f().10.#定義函數(shù)g:11.def g():12.pr int call g().13.#返回函數(shù)g:14.return g15. 仔細(xì)觀察上面的函數(shù)定義,我們?cè)诤瘮?shù)f內(nèi)部又定義了一個(gè)函數(shù) g。由于函數(shù)g也是一個(gè)對(duì)象,函數(shù)名g就是指向函數(shù) g的變量,所以,最外層函數(shù)f可以返回變量g,也就是函數(shù)g 本身。16. 調(diào)用函數(shù)f,我們會(huì)得到f返回的一個(gè)函數(shù):17. x = f()# 調(diào)用 f()18. call f().19. x#變量x是f()返回的函數(shù):20. vfunction g at 0x1037bf32021. x()# x指向函數(shù),因此可以調(diào)
12、用22. call g().#調(diào)用x()就是執(zhí)行g(shù)()函數(shù)定義的代碼23. 請(qǐng)注意區(qū)分返回函數(shù)和返回值:24. def myabs():25. return abs# 返回函數(shù)26. def myabs2(x):27. return abs(x)#返回函數(shù)調(diào)用的結(jié)果,返回值是一個(gè)數(shù)值28. 返回函數(shù)可以把一些計(jì)算延遲執(zhí)行。例如,如果定義一個(gè)普通的求和函數(shù):29. def calc_sum(lst):30. return sum(lst)31. 調(diào)用calc_sum()函數(shù)時(shí),將立刻計(jì)算并得到結(jié)果:32. calc_sum(1,2, 3, 4)33.1034.但是,如果返回一個(gè)函數(shù),就可以“延遲
13、計(jì)算”:35.def calc_sum(lst):36.def lazy_sum():37.return sum(lst)38.return lazy_sum39.#調(diào)用calc_sum()并沒(méi)有計(jì)算岀結(jié)果,而是返回函數(shù)40. f = calc_sum(1,2, 3, 4)41. f42. 43. #對(duì)返回的函數(shù)進(jìn)行調(diào)用時(shí),才計(jì)算岀結(jié)果 :44. f()45.1046.由于可以返回函數(shù),我們?cè)诤罄m(xù)代碼里就可以決定到底要不要調(diào)用該函數(shù)。請(qǐng)編寫(xiě)一個(gè)函數(shù)calc_prod(lst),它接收一個(gè)list ,返回一個(gè)函數(shù),返回函數(shù)可以計(jì)算參數(shù)的乘積。def calc_prod(lst):def lazy
14、_prod():def f(x, y):return x * yretur n reduce(f, lst, 1)return lazy_prodf = calc_prod(1,2, 3, 4)pri nt f()6. 閉包在函數(shù)內(nèi)部定義的函數(shù)和外部定義的函數(shù)是一樣的,只是他們無(wú)法被外部訪問(wèn):def g():pri ntg()def f():pri ntf().return g將 g的定義移入函數(shù)f 內(nèi)部,防止其他代碼調(diào)用 g:def f():pri ntf().def g():pri nt g()return g但是,考察上一小節(jié)定義的calc_sum 函數(shù):def calc_sum(lst
15、):def lazy_sum():return sum(lst)return lazy_sum注意:發(fā)現(xiàn)沒(méi)法把lazy_sum 移到 calc_sum 的外部,因?yàn)樗昧?calc_sum 的參數(shù) lst。像這種內(nèi)層函數(shù)引用了外層函數(shù)的變量(參數(shù)也算變量),然后返回內(nèi)層函數(shù)的情況, 稱(chēng)為閉包(Closure )。閉包的特點(diǎn) 是返回的函數(shù)還引用了外層函數(shù)的局部變量,所以,要正確使用閉包,就要確保引用的局部變量在函數(shù)返回后不能變。舉例如下:#希望一次返回3個(gè)函數(shù),分別計(jì)算1x1,2x2,3x3:def cou nt():fs =for i in ran ge(1,4):def f():retur
16、n i*ifs.appe nd(f)return fsf1, f2, f3 = cou nt()你可能認(rèn)為調(diào)用f1() , f2()和f3()結(jié)果應(yīng)該是1, 4 , 9,但實(shí)際結(jié)果全部都是9 (請(qǐng)自己動(dòng)手驗(yàn)證)。原因就是當(dāng)count()函數(shù)返回了 3個(gè)函數(shù)時(shí),這 3個(gè)函數(shù)所引用的 變量i 的值已經(jīng)變成了 3。 由于fl、f2、f3并沒(méi)有被調(diào)用,所以,此時(shí)他們并未計(jì)算i*i ,當(dāng)fl被調(diào)用時(shí): f1()9#因?yàn)閒l現(xiàn)在才計(jì)算i*i ,但現(xiàn)在i的值已經(jīng)變?yōu)?3因此,返回函數(shù)不要引用任何循環(huán)變量,或者后續(xù)會(huì)發(fā)生變化的變量。返回閉包不能引用循環(huán)變量,請(qǐng)改寫(xiě)count()函數(shù),讓它正確返回能計(jì)算1x1、
17、2x2、3x3的函數(shù)def f(j):def g():return j*jreturn g它可以正確地返回一個(gè)閉包g,g所引用的變量j不是循環(huán)變量,因此將正常執(zhí)行。在count函數(shù)的循環(huán)內(nèi)部,如果借助f函數(shù),就可以避免引用循環(huán)變量i。參考代碼:def cou nt():fs =for i in ran ge(1,4):def f(j):def g():return j*jreturn gr = f(i)fs.appe nd(r)return fsf1, f2, f3 = cou nt()pri nt f1(), f2(), f3()7. 匿名函數(shù)高階函數(shù)可以接收函數(shù)做參數(shù),有些時(shí)候,我們不需要
18、顯式地定義函數(shù),直接傳入匿名函數(shù)更方便。在Python中,對(duì)匿名函數(shù)提供了有限支持。還是以map()函數(shù)為例,計(jì)算f(x)=x 2時(shí),除了定義一個(gè)f(x)的函數(shù)外,還可以直接傳入匿名函數(shù): map(lambda x: x * x, 1,2, 3, 4, 5, 6, 7, 8, 9)1,4, 9, 16, 25, 36, 49, 64, 81通過(guò)對(duì)比可以看岀,匿名函數(shù)lambda x: x * x 實(shí)際上就是:def f(x):return x * x關(guān)鍵字lambda 表示匿名函數(shù),冒號(hào)前面的x表示函數(shù)參數(shù)。匿名函數(shù)有個(gè)限制,就是只能有一個(gè)表達(dá)式,不寫(xiě)return,返回值就是該表達(dá)式的結(jié)果。使用匿名函數(shù),可以不必定義函數(shù)名,直接創(chuàng)建一個(gè)函數(shù)對(duì)象,很多時(shí)候可以簡(jiǎn)化代碼: sorted(1,3, 9, 5, 0, lambda x,y: -cmp(x,y)9, 5, 3, 1,
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 安全可視化技術(shù)
- 醫(yī)療信息系統(tǒng)的安全問(wèn)題考核試卷
- 面向未來(lái)的績(jī)效考核模式研究
- 2024年個(gè)人二手汽車(chē)買(mǎi)賣(mài)合同
- 2024年式太陽(yáng)能光伏系統(tǒng)建設(shè)合同
- 2024年庫(kù)房租賃與藝術(shù)品展覽合同
- 農(nóng)業(yè)協(xié)會(huì)財(cái)務(wù)管理制度研究
- 2024年外籍員工派遣合同范本
- 公共設(shè)施能耗與綠色環(huán)保管理考核試卷
- 脾虛證預(yù)后評(píng)估
- 鈉與水的反應(yīng)
- 議論文寫(xiě)作技巧
- 教科版五年級(jí)科學(xué)上冊(cè)(風(fēng)的作用) 教學(xué)課件
- 二年級(jí)下冊(cè)語(yǔ)文試題 -“詩(shī)詞大會(huì)”題庫(kù)二 (word版有答案) 人教部編版
- GB/T 7702.20-2008煤質(zhì)顆?;钚蕴吭囼?yàn)方法孔容積和比表面積的測(cè)定
- 新歷史主義文藝思潮
- GB/T 40120-2021農(nóng)業(yè)灌溉設(shè)備灌溉用熱塑性可折疊軟管技術(shù)規(guī)范和試驗(yàn)方法
- GB/T 3903.2-1994鞋類(lèi)通用檢驗(yàn)方法耐磨試驗(yàn)方法
- GB/T 10801.2-2018絕熱用擠塑聚苯乙烯泡沫塑料(XPS)
- 12J5-1 平屋面建筑標(biāo)準(zhǔn)設(shè)計(jì)圖
- 中印邊境爭(zhēng)端
評(píng)論
0/150
提交評(píng)論