python常用函數(shù)_第1頁
python常用函數(shù)_第2頁
python常用函數(shù)_第3頁
python常用函數(shù)_第4頁
python常用函數(shù)_第5頁
已閱讀5頁,還剩5頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、實(shí)用標(biāo)準(zhǔn)文檔文案大全1.map()函數(shù)map()是Python內(nèi)置的高階函數(shù),它接收一個(gè)函數(shù)f和一個(gè)list ,并通過把函數(shù)f依次作用在list的每個(gè)元素上,得到一個(gè)新的list并返回。如果希望把list的每個(gè)元素都作平方,就可以用map()函數(shù):因此,我們只需要傳入函數(shù)例如,對(duì)于 list 1, 2, 3, 4, 5, 6, 7, 8, 9f(x)=x*x ,就可以利用map()函數(shù)完成這個(gè)計(jì)算:def f(x): _|return x*xprint map(f, 1,2, 3, 4, 5, 6, 7, 8, 9)輸出結(jié)果:1,4, 9, 10, 25, 36, 49, 64, 81可以用列

2、表替代>>> print tx*x for x in ransfe<10i 1 0,4, 9, 1&, 25, 36, 4% 64. 811»>注意:map()函數(shù)不改變?cè)械膌ist ,而是返回一個(gè)新的list 。利用map()函數(shù),可以把一個(gè)list 轉(zhuǎn)換為另一個(gè)list ,只需要傳入轉(zhuǎn)換函數(shù) 由于list包含的元素可以是任何類型,因此, map()不僅僅可以處理只包含數(shù)值的list ,事實(shí)上它 可以處理包含任意類型的list ,只要傳入的函數(shù)f可以處理這種數(shù)據(jù)類型。假設(shè)用戶輸入的英文名字不規(guī)范,沒有按照首字母大寫,后續(xù)字母小寫的規(guī)則,請(qǐng)利用

3、 map()函數(shù), 把一個(gè)list (包含若干不規(guī)范的英文名字)變成一個(gè)包含規(guī)范英文名字的list :輸入:'adam','LISA','barT' 輸出:'Adam', 'Lisa', 'Bart' format_name(s)函數(shù)接收一個(gè)字符串,并且要返回格式化后的字符串,利用 map()函數(shù),就可以輸出 新的list 。def format_name(s):return s0.upper() + s1:.lower()print map(format_name, 'adam',

4、 'LISA', 'barT')2.reduce()函數(shù)reduce()函數(shù)也是Python內(nèi)置的一個(gè)高階函數(shù)。reduce()函數(shù)接收的參數(shù)和 map()類似,一個(gè)函數(shù) f, 一個(gè)list ,但行為和map()不同,reduce()傳入的函數(shù)f必須接收兩個(gè)參數(shù),reduce()對(duì)list 的每個(gè)元素反復(fù)調(diào)用函數(shù)f,并返回最終結(jié)果值。例如,編寫一個(gè)f函數(shù),接收x和y,返回x和y的和:def f(x, y):return x + y調(diào)用 reduce(f, 1,3, 5,7, 9)時(shí),reduce函數(shù)將做如下計(jì)算:先計(jì)算頭兩個(gè)元素:f(1, 3),結(jié)果為4;再把結(jié)

5、果和第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;由于沒有更多的元素了,計(jì)算結(jié)束,返回結(jié)果25。上述計(jì)算實(shí)際上是對(duì)list的所有元素求和。雖然Python內(nèi)置了求和函數(shù)sum(),但是,利用reduce()求和也很簡單。reduce()還可以接收第3個(gè)可選參數(shù),作為計(jì)算的初始值。如果把初始值設(shè)為100,計(jì)算:reduce(f, 1, 3, 5, 7, 9, 100)結(jié)果將變?yōu)?25,因?yàn)榈谝惠営?jì)算是:計(jì)算初始值和第一個(gè)元素:f(100, 1),結(jié)果為101。Python內(nèi)置了求和函數(shù)sum

6、(),但沒有求積的函數(shù),請(qǐng)利用 recude()來求積:輸入:2, 4, 5, 7,12輸出:2*4*5*7*12 的結(jié)果reduce()接收的函數(shù)f需要兩個(gè)參數(shù),并返回一個(gè)結(jié)果,以便繼續(xù)進(jìn)行下一輪計(jì)算。參考彳t碼:def prod(x, y):return x * yprint reduce(prod, 2, 4, 5, 7, 12)3.filter() 函數(shù)filter。 函數(shù)是 Python內(nèi)置的另一個(gè)有用的高階函數(shù),filter() 函數(shù)接收一個(gè)函數(shù)f 和一個(gè) list ,這個(gè)函數(shù) f的作用是對(duì)每個(gè)元素進(jìn)行判斷,返回 True或False , filter() 根據(jù)判斷結(jié)果 自動(dòng)過濾掉

7、不符合條件的元素,返回由符合條件元素組成的新list o例如,要從一個(gè)list 1,4, 6, 7, 9, 12, 17中刪除偶數(shù),保留奇數(shù),首先,要編寫一個(gè)判斷奇數(shù)的函數(shù):def is_odd(x):return x % 2 = 1然后,利用filter()過濾掉偶數(shù):filter(is_odd, 1,4, 6, 7, 9, 12, 17)結(jié)果:1,7, 9,17利用filter(),可以完成很多有用的功能,例如,刪除 None或者空字符串:def is_not_empty(s):return s and len(s.strip() > 0filter(is_not_empty, &#

8、39;test', None, '', 'str', ' ', 'END')結(jié)果:'test', 'str', 'END'注意:s.strip(rm) 刪除s字符串中開頭、結(jié)尾處的rm序列的字符。當(dāng)rm為空時(shí),默認(rèn)刪除空白符(包括'n', 'r', 't',''),如下:a = '123'|a.strip()結(jié)果: '123'a='tt123 rn 'a.strip

9、()結(jié)果:123'請(qǐng)利用filter()過濾出1100中平方根是整數(shù)的數(shù),即結(jié)果應(yīng)該是:1,4, 9, 16, 25, 36, 49, 64, 81, 100filter。接收的函數(shù)必須判斷出一個(gè)數(shù)的平方根是否是整數(shù),而math.sqrt()返回結(jié)果是浮點(diǎn)數(shù)。參考彳t碼:import mathdef is_sqr(x):r = int(math.sqrt(x)return r*r=xprint filter(is_sqr, range(1, 101)4 .自定義排序函數(shù) sorted()Python內(nèi)置的 sorted()函數(shù)可對(duì)list 進(jìn)行排序:>>>sorted

10、(36, 5, 12, 9, 21)5, 9,12, 21, 36但sorted()也是一個(gè)高階函數(shù),它可以接收一個(gè)比較函數(shù)來實(shí)現(xiàn)自定義排序,比較函數(shù)的定義是,傳入兩個(gè)待比較的元素x, y ,如果x應(yīng)該排在y的前面,返回-1 ,如果x應(yīng)該排在y的后面, 返回1。如果x和y相等,返回0。因此,如果我們要實(shí)現(xiàn)倒序排序,只需要編寫一個(gè)reversed_cmp函數(shù):def reversed_cmp(x, y):if x > y:return -1if x < y:return 1return 0這樣,調(diào)用sorted() 并傳入reversed_cmp就可以實(shí)現(xiàn)倒序排序:>>&

11、gt; sorted(36, 5, 12, 9, 21, reversed_cmp)36, 21, 12, 9, 5|sorted()也可以對(duì)字符串進(jìn)行排序,字符串默認(rèn)按照ASCII大小來比較:>>> sorted('bob', 'about', 'Zoo', 'Credit')'Credit', 'Zoo', 'about', 'bob''Zoo'排在'about'之前是因?yàn)閆'的ASCII碼比'a&

12、#39;小。對(duì)于比較函數(shù)cmp_ignore_case(s1, s2),要忽略大小寫比較,就是先把兩個(gè)字符串都變成大寫(或 者都變成小寫),再比較。參考彳t碼:def cmp_ignore_case(s1, s2):u1 = s1.upper()u2 = s2.upper()if u1 < u2:return -1if u1 > u2:return 1return 0print sorted('bob', 'about', 'Zoo', 'Credit', cmp_ignore_case)5 .返回函數(shù)6 .Pytho

13、n的函數(shù)不但可以返回int、str、list 、dict等數(shù)據(jù)類型,還可以返回函數(shù)!7 .例如,定義一個(gè)函數(shù)f(),我們讓它返回一個(gè)函數(shù)g ,可以這樣寫:8 .def f():9 . print 'call f()'10 .#定義函數(shù)g:11 . def g():12 .print '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ì)得到

14、f返回的一個(gè)函數(shù):17 .>>> x = f()# 調(diào)用 f()18 .call f().19 .>>> x #變量x是f()返回的函數(shù):20 .<function g at 0x1037bf320>21 .>>> x()# x指向函數(shù),因此可以調(diào)用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ù)

15、值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ù),就可以“延遲計(jì)算”:35 .def calc_sum(lst):36 . def lazy_sum():37 . return sum(lst)38 . return lazy_sum39 .#調(diào)用calc_sum()并沒有計(jì)算出結(jié)果,而是返回函數(shù) :40 .&g

16、t;>> f = calc_sum(1,2, 3, 4)41 .>>> f42 .<function lazy_sum at 0x1037bfaa0>43 .#對(duì)返回的函數(shù)進(jìn)行調(diào)用時(shí),才計(jì)算出結(jié)果 :44 .>>> f()45.1046.由于可以返回函數(shù),我們?cè)诤罄m(xù)代碼里就可以決定到底要不要調(diào)用該函數(shù)。請(qǐng)編寫一個(gè)函數(shù) calc_prod(lst) ,它接收一個(gè)list ,返回一個(gè)函數(shù),返回函數(shù)可以計(jì)算參數(shù)的 乘積。def calc_prod(lst):def lazy_prod():def f(x, y):return x * yre

17、turn reduce(f, 1st, 1)return lazy_prodf = calc_prod(1,2, 3, 4)print f()6.閉包在函數(shù)內(nèi)部定義的函數(shù)和外部定義的函數(shù)是一樣的,只是他們無法被外部訪問:def g():print 'g().'def f():print 'f().'return g將 g的定義移入函數(shù)f 內(nèi)部,防止其他代碼調(diào)用g:def f():print 'f().'def g():print 'g().'return g但是,考察上一小節(jié)定義的calc_sum 函數(shù):def calc_sum(

18、lst):def lazy_sum():return sum(lst)return lazy_sum注意:發(fā)現(xiàn)沒法把lazy_sum 移到 calc_sum 的外部,因?yàn)樗昧薱alc_sum 的參數(shù) 1st。像這種內(nèi)層函數(shù)引用了外層函數(shù)的變量(參數(shù)也算變量),然后返回內(nèi)層函數(shù)的情況,稱為閉包(Closure )。閉包的特點(diǎn) 是返回的函數(shù)還引用了外層函數(shù)的局部變量,所以,要正確使用閉包,就要確保引用的局部變量在函數(shù)返回后不能變。舉例如下:#希望一次返回3個(gè)函數(shù),分別計(jì)算1x1,2x2,3x3:def count():fs = 口for i in range(1,4):def f(): ret

19、urn i*ifs.append(f)return fsf1, f2, f3 = count()你可能認(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)變成了3c由于fl、f2、f3并沒有被調(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)改寫count()函數(shù),讓它正確返

20、回能計(jì)算1x1、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 o參考彳t碼:def count():fs = 口for i in range(1,4):def f(j):def g():return j*jreturn gr = f(i)fs.append(r)return fsf1, f2, f3 = count()print f1(), f2(), f3()7.匿名函數(shù)高階函數(shù)可以接收函數(shù)做參數(shù),有些時(shí)候,我們不需要顯式地定義函數(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,

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(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ǔ)空間,僅對(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論