python函数式编程、高阶函数
1、map()
python內置的高階函數,接收一個函數f和一個list,并通過把函數f依次作用在list的每個元素上,得到一個新的list并返回。
def f(x):return x * xprint map(f , [ 1 , 2 , 3 , 4 ])輸出----> [1,4,9,16]注:map()并不改變原有的list,而是返回一個新的list
2、reduce()
內置高階函數,接收一個函數f和一個list。f必須接收兩個參數,reduc()對list的每個元素反復調用f,并返回最終結果值。
def f(x,y):reeturn x+y reduce(f,[1,3,5])運行----> f(1,3) = 4f(4,5) = 9 將上面使用 f 執行的到的結果作為這個 f 的第一個參數計算結果返回 9reduce()可接收第三個可選參數,作為計算的初始值。
reduce(f,[1,3,5],100) 那么運算結果就是109
3、filter()
內置高階函數,作用類似于過濾。接收f和list,f的作用是對每一個元素進行判斷,返回True和False。filter()根據判斷結果自動過濾掉不符合條件的元素(False),返回由符合條件元素組成的新list。
4、sorted() 可對list進行排序
>>>sorted([36,5,12,9,21])[5,9,12,21,36]sorted也是一個高階函數,接收一個比較函數實現自定義排序。
比較函數的定義:
傳入兩個待比較的元素x,y
如果x應排在y前面,返回-1
如果x應排在y后面,返回1
如果x等于y,返回0
#實現倒序排序 def reversed_cmp(x,y):if x > y:return -1if x < y:return 1return 0sorted([36,5,12,9,21] , reversed_cmp)運行------> [36,21,12,9,5]5、Python返回函數
''' 遇到問題沒人解答?小編創建了一個Python學習交流QQ群:531509025 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' #返回函數和返回函數值的區別 def f():print 'call f()...'def g():print 'call g()...'return g #這兒返回的是指向g()這個函數的變量g #如果是 return g() 那么是返回g()這個函數計算的返回值>>> x = f() call f()... >>> x <function g at 0x10376f320> >>>x() call g()... #延遲計算6、Python閉包
內層函數引用了外層函數的變量(參數也算變量),然后返回內層函數的情況,稱為閉包(Closure)。
閉包的特點是返回的函數還引用了外層函數的局部變量,所以,要正確使用閉包,就要確保引用的局部變量在函數返回后不能變。
# 希望一次返回3個函數,分別計算1x1,2x2,3x3: def count():fs = []for i in range(1, 4):def f():return i*ifs.append(f)return fsf1, f2, f3 = count() #實際上返回結果并不是1,4,9 而是 9,9,9,#原因就是當count()函數返回了3個函數時,這3個函數所引用的變量 i 的值已經變成了3。由于f1、f2、f3并沒有被調用,#所以,此時他們并未計算 i*i,當 f1 被調用時:因為f1現在才計算i*i,但現在i的值已經變成3因此,返回函數不要引用任何循環變量,或者后續會發生變化的變量。
修改上述代碼使之正確返回1,4,9
''' 遇到問題沒人解答?小編創建了一個Python學習交流QQ群:531509025 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' def count():fs = []for i in range(1, 4):def f(m = i):return m * mfs.append(f)return fsf1, f2, f3 = count() print f1(), f2(), f3()7、Python 匿名函數
#正常函數 def addNum(a,b):return a + b#等同的匿名函數 lam = lambda a,b:a+b #冒號前為參數8、裝飾器@decorator
python內置的@語法就是為了簡化裝飾器調用
@new_fn def f1(x):def f1(x): -------> return x * 2return x * 2 f1 = new_fn(f1)作用:
極大地簡化代碼。避免每個函數編寫重復代碼。
-
打印日志:@log
-
檢測性能:@preformance
-
數據庫事物:@transaction
-
URL路由:@post(’/register’)
總結
以上是生活随笔為你收集整理的python函数式编程、高阶函数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: django 中实现文件下载的3种方式
- 下一篇: Python re 模块findall(