函數式編程:容許把函數自己做爲參數傳入另外一個函數,還容許返回一個函數。python
1.高階函數編程
一個函數能夠接收另外一個函數做爲參數,這種函數稱爲高階函數閉包
def add(x,y,f):app
return f(x) + f(y)函數式編程
x = -5 、y = 六、 f = abs、 f(x) + f(y) = abs(-5) + abs(6) = 11函數
return 11spa
2.map/reducecode
map函數:接收兩個參數,一個是函數,一個是可迭代對象。map的做用是將傳入的函數依次做用到序列的每一個元素,並將結果做爲迭代器返回對象
>>> def f(x): ... return x * x ... >>> r = map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9]) >>> list(r) [1, 4, 9, 16, 25, 36, 49, 64, 81]
reduce函數:接收兩個參數,一個是函數,一個是可迭代對象。reduce的做用是將每個元素的函數結果做用到下一個元素中排序
reduce(f,[x1,x2,x3,x4]) = f(f(f(x1,x2),x3),x4)
def prod(x,y):
return x * y
print(reduce(prod,[1,3,5])) #15
3.filter
filter函數用於過濾序列,一樣接收函數和可迭代對象,將函數做用於每個元素中,而後進行篩選
4.sorted
排序函數能夠直接比較兩個元素的大小
sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower) ['about', 'bob', 'Credit', 'Zoo']
5.返回函數
函數嵌套函數時,將內部函數做爲結果進行返回。內部函數能夠引用外部函數的參數和局部變量。這種方式稱爲閉包。
返回函數不要引用任何循環變量,或者是變化的變量。函數的返回值不是當即執行,而是在調用以後纔開始執行。若要使用循環變量,則須要再建立新的函數,將該變量做爲參數傳入。
6.匿名函數
lambda x : x * x = def f(x):
return x * x
也能夠先將匿名函數賦值給變量,再調用該變量。
7.裝飾器
在代碼動態運行期間動態增長功能,被稱爲裝飾器(就是用一個透明的大函數包裹起來,在程序運行時調用這個函數)
#定義
def log(func):
def wrapper(*args,**kw):
print('call %s():' % func.__name__) #兩橫
return func(* args,**kw)
return wrapper
@log = now = log(now)
def now():
print('2018-12-11')
#調用
now()
#輸出
call now():
2018-12-11
8.偏函數
偏函數位於functools的模塊中,名稱爲partial。做用爲將一個函數的某些參數給固定住,返回一個新的函數,從而加強做用。