標籤:
1.概念:
函數式編程就是一種抽象程度很http://i.cnblogs.com/EditPosts.aspx?opt=1高的編程範式,純粹的函數式程式設計語言編寫的函數沒有變數,因此,任意一個函數,只要輸入是確定的,輸出就是確定的,這種純函數我們稱之為沒有副作用。而允許使用變數的程式設計語言,由於函數內部的變數狀態不確定,同樣的輸入,可能得到不同的輸出,因此,這種函數是有副作 用的。
函數式編程的一個特點就是,允許把函數本身作為參數傳入另一個函數,還允許返回一個函數!Python對函數式編程提供部分支援。由於Python允許使用變數,因此,Python不是純函數式程式設計語言。
2.高階函數:一個函數可以接收另一個函數作為參數,這種函數就稱之為高階函數。
1)變數可以指向函數:函數本身也可以賦值給變數,即:變數可以指向函數
f = abs
>>> f(-10)
2)函數名也是變數:
abs = 10
>>> abs(-10)出錯
把abs
指向10
後,就無法通過abs(-10)
調用該函數了!因為abs
這個變數已經不指向求絕對值函數了!
3)傳入函數:
def add(x, y, f):
return f(x) + f(y)
4)map/reduce:
map()
函數接收兩個參數,一個是函數,一個是序列,map
將傳入的函數依次作用到序列的每個元素,並把結果作為新的list返回。map()
作為高階函數,它把運算規則抽象了。
執行個體:實現x*x
def f(x):
return x * x
>>>map(f,[1,2,3,4,5])
[1, 4, 9, 16, 25
]
reduce()把一個函數作用在一個序列[x1, x2, x3...]上,這個函數必須接收兩個參數,reduce把結果繼續和序列的下一個元素做累積計算。
即reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)
def fn(x, y):
return x * 10 + y
>>>reduce(fn, [1, 3, 5, 7, 9])
13579
5)filter:
filter()
函數用於過濾序列,filter()
也接收一個函數和一個序列,filter()
把傳入的函數依次作用於每個元素,然後根據傳回值是True
還是False
決定保留還是丟棄該元素。
def is_odd(n):
return n % 2 == 1
>>>filter(is_odd, [1, 2, 4, 5, 6, 9, 10, 15])
[1, 5, 9, 15]
6)sorted:
def reversed_cmp(x, y):
if x > y:
return -1
if x < y:
return 1
return 0
>>>sorted([36, 5, 12, 9, 21], reversed_cmp)
3.返回函數:高階函數除了可以接受函數作為參數外,還可以把函數作為結果值返回。
1)函數作為傳回值:
def lazy_sum(*args):
def sum():
ax = 0
for n in args:
ax = ax + n
return ax
return sum
2)閉包:
返回的函數在其定義內部引用了局部變數args
,所以,當一個函數返回了一個函數後,其內部的局部變數還被新函數引用。返回閉包時牢記的一點就是:返回函數不要引用任何迴圈變數,或者後續會發生變化的變數。
4.lambda:
lambda
表示匿名函數,冒號前面的x
表示函數參數,就是只能有一個運算式,不用寫return
,傳回值就是該運算式的結果。
>>>map(lambda x: x * x, [1, 2, 3, 4, 5, 6, 7, 8, 9])
5.裝飾器:假設我們要增強某個
函數的功能,比如,在函數調用前後自動列印日誌,但又不希望修改原
函數的定義,這種在代碼運行期間動態增加功能的方式,稱之為“裝飾器”(Decorator)。
def now():
print ‘2013-12-25‘
>>>now.__name__ #可以獲得函數名
def log(func):
def wrapper(*args, **kw):
print ‘call %s():‘ % func.__name__
return func(*args, **kw)
return wrapper
@log
def now():
print ‘2013-12-25‘
6.偏函數:
functools.partial()
:把一個函數的某些參數給固定住(也就是設定預設值),返回一個新的函數,調用這個新函數會更簡單。
python筆記三:函數式編程