函數式編程就是一種抽象程度很高的編程範式,純粹的函數式編程語言編寫的函數沒有變量,所以,任意一個函數,只要輸入是肯定的,輸出就是肯定的,這種純函數咱們稱之爲沒有反作用。而容許使用變量的程序設計語言,因爲函數內部的變量狀態不肯定,一樣的輸入,可能獲得不一樣的輸出,所以,這種函數是有反作用的。 python
函數式編程的一個特色就是,容許把函數自己做爲參數傳入另外一個函數,還容許返回一個函數! 編程
Python對函數式編程提供部分支持。因爲Python容許使用變量,所以,Python不是純函數式編程語言。 app
map函數:對list的每一個元素做用於傳入的函數中 編程語言
def fc(x): return x*x print map(fc, [1, 2, 3, 4, 5, 6, 7, 8, 9])# 將list的每一個元素在fc中調用;參數:函數、list 結果: [1, 4, 9, 16, 25, 36, 49, 64, 81]
def prod(x,y): return x*y List = [1, 2, 3, 4, 5, 6, 7, 8, 9] print reduce(prod,List)# 相似於1,2先傳入prod,2*3傳入,6*4傳入... 結果: 362880
filter函數:和map()相似,filter()也接收一個函數和一個序列。和map()不一樣的時,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]
把一個序列中的空字符串刪掉: 函數
def not_empty(s): return s and s.strip()# 「s字符串」 與 「s字符串首尾刪除空格後的字符串」的交集 filter(not_empty, ['A', '', 'B', None, 'C', ' ']) # 結果: ['A', 'B', 'C']
L = range(1,101) print L def dealMethond(x): return x%2 == 0 print filter(dealMethond, L) # 對L中的元素進行過濾
sorted對元素進行排序: spa
def reverse(s1, s2): if s1 < s2: return 1 elif s1 == s2: return 0 else : return -1 List = ['a', 1, 'd', 'b','120'] print sorted(List, reverse) # 能夠自定義排序規則 結果:['d', 'b', 'a', '120', 1]
sorted(None, list)
返回函數: 設計
高階函數除了能夠接受函數做爲參數外,還能夠把函數做爲結果值返回 code
def count(): fs = [] for i in range(1, 4): def square(i): def func(): return i*i return func fs.append(square(i)) return fs f1, f2, f3 = count() print f1(), f2(), f3()
匿名函數: 對象
關鍵字lambda表示匿名函數,匿名函數有個限制,就是隻能有一個表達式,不用寫return,返回值就是該表達式的結果。用匿名函數有個好處,由於函數沒有名字,沒必要擔憂函數名衝突。此外,匿名函數也是一個函數對象,也能夠把匿名函數賦值給一個變量,再利用變量來調用該函數
能夠把匿名函數做爲返回值返回:
def count(): fs = [] for i in range(1, 4): def func(i): return lambda i = i: i*i fs.append(func(i)) return fs f1, f2, f3 = count() print f1(), f2(), f3()
裝飾器:
decorator就是一個返回函數的高階函數
def log(func): @functools.wraps(func) def wrapper(*args, **kw): print '%s():%s' % (func.__name__, args[0]) return func(*args, **kw) return wrapper @log def f(name): return 'f now %s' % name print f('syc') 結果: f():syc f now syc
當log帶參數時:
def log(text=None): def decorator(func): @functools.wraps(func) def wrapper(*args, **kw): print '%s():%s:%s' % (func.__name__, args[0], text) return func(*args, **kw) return wrapper return decorator @log('execute') def f(name): return 'f now %s' % name print f('syc') 結果: f():syc:execute f now syc
偏函數:
使用functools.partial能夠建立一個新的函數,這個新函數能夠固定住原函數的部分參數,從而在調用時更簡單。
int2 = functools.partial(int, base=8) print int2('10001011') 結果:2097673