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

下載本文檔

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

文檔簡介

1、實用標準文檔1. map() 函數(shù)map() 是 Python 內(nèi)置的高階函數(shù),它接收一個 函數(shù) f 和一個 list ,并通過把函數(shù) f 依次作用在 list 的每個元素上,得到一個新的 list 并返回。例如,對于 list 1, 2, 3, 4, 5, 6, 7, 8, 9如果希望把 list 的每個元素都作平方,就可以用 map()函數(shù):輸出結(jié)果:1, 4, 9, 10, 25, 36, 49, 64, 81可以用列表替代注意: map() 函數(shù)不改變原有的 list ,而是返回一個新的 list 。利用 map()函數(shù),可以把一個 list 轉(zhuǎn)換為另一個 list ,只需要傳入轉(zhuǎn)換函

2、數(shù)。由于 list 包含的元素可以是任何類型,因此, map() 不僅僅可以處理只包含數(shù)值的 list ,事實上它 可以處理包含任意類型的 list ,只要傳入的函數(shù) f 可以處理這種數(shù)據(jù)類型。假設(shè)用戶輸入的英文名字不規(guī)范,沒有按照首字母大寫,后續(xù)字母小寫的規(guī)則,請利用map() 函數(shù),把一個 list (包含若干不規(guī)范的英文名字)變成一個包含規(guī)范英文名字的 list :輸入: 'adam', 'LISA', 'barT'輸出: 'Adam', 'Lisa', 'Bart'format_name(s

3、) 函數(shù)接收一個字符串,并且要返回格式化后的字符串,利用 map()函數(shù),就可以輸出 新的 list 。參考代碼 :def format_name(s):return s0.upper() + s1:.lower()print map(format name, 'adam', 'LISA', 'barT')2. reduce() 函數(shù)reduce() 函數(shù)也是 Python 內(nèi)置的一個高階函數(shù)。 reduce() 函數(shù)接收的參數(shù)和 map() 類似, 一個函數(shù) f ,一個 list ,但行為和 map() 不同, reduce() 傳入的函數(shù) f

4、 必須接收兩個參數(shù), reduce() 對 list 的每個元素反復(fù)調(diào)用函數(shù) f ,并返回最終結(jié)果值。例如,編寫一個 f 函數(shù),接收 x 和 y ,返回 x 和 y 的和:def f(x, y):return x + y調(diào)用 reduce(f, 1, 3, 5, 7, 9)時, reduce 函數(shù)將做如下計算:先計算頭兩個元素: f(1, 3) ,結(jié)果為 4;再把結(jié)果和第3 個元素計算:f(4, 5),結(jié)果為 9;再把結(jié)果和第4 個元素計算:f(9, 7),結(jié)果為 16;再把結(jié)果和第5 個元素計算:f(16, 9),結(jié)果為 25;由于沒有更多的元素了,計算結(jié)束,返回結(jié)果 25。上述計算實際上是

5、對 list 的所有元素求和。雖然 Python 內(nèi)置了求和函數(shù) sum() ,但是,利用 reduce() 求和也很簡單。reduce() 還可以接收第 3 個可選參數(shù),作為計算的初始值。 如果把初始值設(shè)為 100,計算:reduce(f, 1, 3, 5, 7, 9, 100)結(jié)果將變?yōu)?125,因為第一輪計算是: 計算初始值和第一個元素: f(100, 1) ,結(jié)果為 101。Python 內(nèi)置了求和函數(shù) sum() ,但沒有求積的函數(shù),請利用 recude() 來求積: 輸入: 2, 4, 5, 7, 12輸出: 2*4*5*7*12 的結(jié)果reduce() 接收的函數(shù) f 需要兩個參

6、數(shù),并返回一個結(jié)果,以便繼續(xù)進行下一輪計算。 參考代碼 :def prod(x, y):return x * yprint reduce(prod, 2, 4, 5, 7, 12)3. filter() 函數(shù)filter() 函數(shù)是 Python 內(nèi)置的另一個有用的高階函數(shù), filter() 函數(shù)接收一個 函數(shù) f 和一個 list ,這個函數(shù) f 的作用是對每個元素進行判斷,返回 True 或 False , filter() 根據(jù)判斷結(jié)果 自動過濾掉不符合條件的元素,返回由符合條件元素組成的新 list 。例如,要從一個 list 1, 4, 6, 7, 9, 12, 17 中刪除偶數(shù),

7、保留奇數(shù),首先,要編寫一個判斷奇 數(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, 'test', None, '', 'str', '

8、; ', 'END')結(jié)果: 'test', 'str', 'END'注意 : s.strip(rm) 刪除 s 字符串中開頭、結(jié)尾處的 rm 序列的字符。 當 rm為空時,默認刪除空白符(包括 'n', 'r', 't', ' '),如下:a = ' 123'a.strip()結(jié)果: '123' a='tt123 rn ' a.strip()結(jié)果: '123'請利用 filter() 過濾出 1

9、100 中平方根是整數(shù)的數(shù),即結(jié)果應(yīng)該是: 1, 4, 9, 16, 25, 36, 49, 64, 81, 100filter() 接收的函數(shù)必須判斷出一個數(shù)的平方根是否是整數(shù), 而 math.sqrt() 返回結(jié)果是浮點數(shù)。 參考代碼 :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ù)可對 list 進行排序:>>>sorted(36, 5, 12, 9, 2

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

11、ted() 也可以對字符串進行排序,字符串默認按照 ASCII 大小來比較:>>> sorted('bob', 'about', 'Zoo', 'Credit')'Credit', 'Zoo', 'about', 'bob''Zoo' 排在'about' 之前是因為 'Z' 的 ASCII 碼比'a' 小。對于比較函數(shù) cmp_ignore_case(s1, s2) ,要忽略大小寫比較,

12、就是先把兩個字符串都變成大寫(或 者都變成小寫),再比較。參考代碼 : 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.Python 的函數(shù)不但可以返回 int 、str 、 list 、 dict 等數(shù)據(jù)類型,還可

13、以返回函數(shù)!7.例如,定義一個函數(shù) f() ,我們讓它返回一個函數(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. 仔細觀察上面的函數(shù)定義,我們在函數(shù)f 內(nèi)部又定義了一個函數(shù) g 。由于函數(shù) g 也是一個對象,函數(shù)名 g 就是指向函數(shù) g 的變量,所以,最外層函數(shù) f 可以返回變量 g ,也就是函數(shù) g 本身。16. 調(diào)用函數(shù) f ,我們會得到 f 返回的一個函數(shù):17. >>>

14、 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ù)定義的代碼23. 請注意區(qū)分返回函數(shù)和返回值:24. def myabs():25. return abs # 返回函數(shù)26. def myabs2(x):27. return abs(x) # 返回函數(shù)調(diào)用的結(jié)果,返回值是一個數(shù)值28. 返回函數(shù)可以把

15、一些計算延遲執(zhí)行。例如,如果定義一個普通的求和函數(shù):29. def calc_sum(lst):30. return sum(lst)31. 調(diào)用 calc_sum() 函數(shù)時,將立刻計算并得到結(jié)果:32. >>> calc_sum(1, 2, 3, 4)33.1034.但是,如果返回一個函數(shù),就可以“延遲計算”:35.def calc_sum(lst):36.def lazy_sum():37.return sum(lst)38.return lazy sum39.# 調(diào)用 calc_sum() 并沒有計算出結(jié)果,而是返回函數(shù)40. >>> f = cal

16、c_sum(1, 2, 3, 4)41. >>> f42. <function lazy sum at 0x1037bfaa0>43. # 對返回的函數(shù)進行調(diào)用時,才計算出結(jié)果 :44. >>> f()45.1046. 由于可以返回函數(shù),我們在后續(xù)代碼里就可以決定到底要不要調(diào)用該函數(shù)。請編寫一個函數(shù) calc_prod(lst) ,它接收一個 list ,返回一個函數(shù),返回函數(shù)可以計算參數(shù)的 乘積。def calc_prod(lst):def lazy_prod():def f(x, y):return x * yreturn reduce(f,

17、 lst, 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(lst):def

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

19、:def f():return i*ifs.append(f)return fsf1, f2, f3 = count()你可能認為調(diào)用 f1() , f2() 和 f3() 結(jié)果應(yīng)該是 1,4,9,但實際結(jié)果全部都是9(請自己動手驗證)。原因就是當 count() 函數(shù)返回了 3個函數(shù)時,這 3 個函數(shù)所引用的 變量 i 的值已經(jīng)變成了 3。 由于 f1 、f2 、f3 并沒有被調(diào)用,所以,此時他們并未計算 i*i ,當 f1 被調(diào)用時:>>> f1()9 # 因為 f1 現(xiàn)在才計算 i*i ,但現(xiàn)在 i 的值已經(jīng)變?yōu)?3 因此,返回函數(shù)不要引用任何循環(huán)變量,或者后續(xù)會發(fā)生變

20、化的變量。返回閉包不能引用循環(huán)變量, 請改寫 count() 函數(shù),讓它正確返回能計算 1x1 、2x2 、3x3 的函數(shù) def f(j):def g():return j*jreturn g它可以正確地返回一個閉包 g,g 所引用的變量 j 不是循環(huán)變量,因此將正常執(zhí)行。在 count 函數(shù)的循環(huán)內(nèi)部,如果借助 f 函數(shù),就可以避免引用循環(huán)變量 i 。 參考代碼 : def count(): fs = for i in range(1, 4): def f(j): def g(): return j*j return g r = f(i) fs.append(r) return fs f1, f2, f3 = count() print f1(), f2(), f3()7. 匿名函數(shù) 高階函數(shù)可以接收函數(shù)做參數(shù), 有些時候, 我們不需要顯式地定義函數(shù), 直接傳入匿名函數(shù)更方 便。在 Python 中,對匿名函數(shù)提供了有限支持。還是以map() 函數(shù)為例,計算 f(x)=x 2 時,除了定義一個 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,

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論