項目地址:https://git.io/pytipshtml
函數式編程(英語:functional programming)或稱函數程序設計,又稱泛函編程,是一種編程範型,它將電腦運算視爲數學上的函數計算,而且避免使用程序狀態以及易變對象。函數編程語言最重要的基礎是λ演算(lambda calculus)。並且λ演算的函數能夠接受函數看成輸入(引數)和輸出(傳出值)。(維基百科:函數式編程)python
所謂編程範式(Programming paradigm)是指編程風格、方法或模式,好比面向過程編程(C語言)、面向對象編程(C++)、面向函數式編程(Haskell),並非說某種編程語言必定屬於某種範式,例如 Python 就是多範式編程語言。git
函數式編程具備如下特色:github
避免狀態變量編程
函數也是變量(一等公民,First-Class Citizen)api
高階函數編程語言
面向問題描述而不是面向問題解決步驟ide
值得一提的是,函數式編程的這些特色在實踐過程當中可能並非那麼 Pythonic,甚至與0x00中提到的 The Zen of Python 相悖。例如函數式編程面向問題描述的特色可能讓你更快地寫出更簡潔的代碼,但可讀性卻也大打折扣(可參考這一段Haskell代碼)。不過,雖然 Pythonic 很重要但並非惟一的準則,_The Choice Is Yours_。函數式編程
map(function, iterable, ...)
/filter(function, iterable)
# map 函數的模擬實現 def myMap(func, iterable): for arg in iterable: yield func(arg) names = ["ana", "bob", "dogge"] print(map(lambda x: x.capitalize(), names)) # Python 2.7 中直接返回列表 for name in myMap(lambda x: x.capitalize(), names): print(name)
<map object at 0x11185c9b0> Ana Bob Dogge
# filter 函數的模擬實現 def myFilter(func, iterable): for arg in iterable: if func(arg): yield arg print(filter(lambda x: x % 2 == 0, range(10))) # Python 2.7 中直接返回列表 for i in myFilter(lambda x: x % 2 == 0, range(10)): print(i)
<filter object at 0x11185cbe0> 0 2 4 6 8
functools.reduce(function, iterable[, initializer])
Python 3.5 中reduce
被降格到標準庫functools
,reduce
也是遍歷可迭代對象元素做爲第一個函數的參數,並將結果累計:函數
from functools import reduce print(reduce(lambda a, b: a*b, range(1,5)))
24
functools.partial(func, *args, **keywords)
偏應用函數(Partial Application)讓咱們能夠固定函數的某些參數:
from functools import partial add = lambda a, b: a + b add1024 = partial(add, 1024) add1024(1)
1025
這裏簡單介紹了一些經常使用函數式編程的方法和概念,實際上要傳達的一個最重要的觀念就是函數自己也能夠做爲變量被返回、傳遞給高階函數,這使得咱們能夠更靈活地運用函數解決問題。可是這並不意味着必定要使用上面這些方法來簡化代碼,例如更 Pythonic 的方法推薦儘量使用 List Comprehension 替代map
/filter
(關於 List Comprehension 後面會再單獨介紹)。若是必定想要用函數式編程的方法來寫 Python,也能夠嘗試Fn.py,或者,試試 Haskell。