一、高階函數 map,reduce 1.map() 函數接收兩個參數,一個是函數,一個是序列,map將傳入的函數依次作用到序列的每個元素,並把結果作為新的list返回。 2. reduce 把一個函數作用在一個序列[x1, x2, x3...]上,這個函數必須接收兩個參數,reduce把結果繼續和序 ...
一、高階函數 map,reduce
1.map()
函數接收兩個參數,一個是函數,一個是序列,map
將傳入的函數依次作用到序列的每個元素,並把結果作為新的list返回。
def f(x): return x*x print map(f,range(1,5)) 運行結果: [1, 4, 9, 16]
2. reduce
把一個函數作用在一個序列[x1, x2, x3...]上,這個函數必須接收兩個參數,reduce把結果繼續和序列的下一個元素做累積計算
例如求1-100之和
def f(x,y): return x+y print reduce(f,range(1,5)) 運行結果:10
3.sorted排序
sorted()
函數也是一個高階函數,它還可以接收一個比較函數來實現自定義的排序。
l=[34,25,1,3,50] print sorted(l) #運行結果:[1, 3, 25, 34, 50]
def reverse(x,y): if(x>y): return -1 elif (x<y): return 1 else : return 0 print sorted(l,reverse) #運行結果:[50, 34, 25, 3, 1]
4.函數作為返回值
def f(*args): def sub(): sum = 0 for x in args: sum = sum + x return sum return sub d=f(1,2,3,4,5,6,7) print d() #運行結果:28
把函數作為參數傳入,或者把函數作為返回值返回,這樣的函數稱為高階函數,函數式編程就是指這種高度抽象的編程範式。
二、匿名函數
關鍵字lambda
表示匿名函數,冒號前面的x
表示函數參數。匿名函數有個限制,就是只能有一個表達式,不用寫return
,返回值就是該表達式的結果。
print map(lambda x:x*x,range(1,6)) #運行結果:[1, 4, 9, 16, 25]
三、裝飾器
在代碼運行期間動態增加功能的方式,稱之為“裝飾器”(Decorator)。
import functools #定義裝飾器 def log(f): @functools.wraps(f) def wrapper(*args,**kw): print "call %s"%(f.__name__) f(*args,**kw) return wrapper
因為它是一個decorator,所以接受一個函數作為參數,並返回一個函數。我們要藉助Python的@語法,把decorator置於函數的定義處
#使用裝飾器 @log def getNow(): print '2016-05-26' #調用 getNow() #運行結果:2016-05-26
四、偏函數
functools.partial
的作用就是,把一個函數的某些參數(不管有沒有預設值)給固定住(也就是設置預設值),返回一個新的函數,調用這個新函數會更簡單。
import functools
def func(a,b=1,c=2):
return a+b+c
func2=functools.partial(func,b=2)
func3=functools.partial(func,c=3)
print func2(5)#運行結果9
print func3(1,4)#運行結果8