Python 中的函數式編程 - PyTips 0x02

PyTips

項目地址:https://git.io/pytips

Python 中的函數式編程

函數式編程(英語:functional programming)或稱函數程序設計,又稱泛函編程,是一種編程范型,它將電腦運算視為數學上的函數計算,并且避免使用程序狀態以及易變對象。函數編程語言最重要的基礎是λ演算(lambda calculus)。而且λ演算的函數可以接受函數當作輸入(引數)和輸出(傳出值)。(維基百科:函數式編程)

所謂編程范式(Programming paradigm)是指編程風格、方法或模式,比如面向過程編程(C語言)、面向對象編程(C++)、面向函數式編程(Haskell),并不是說某種編程語言一定屬于某種范式,例如 Python 就是多范式編程語言。

函數式編程

函數式編程具有以下特點:

  1. 避免狀態變量
  2. 函數也是變量(一等公民,First-Class Citizen)
  3. 高階函數
  4. 面向問題描述而不是面向問題解決步驟

值得一提的是,函數式編程的這些特點在實踐過程中可能并不是那么 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 被降格到標準庫functoolsreduce 也是遍歷可迭代對象元素作為第一個函數的參數,并將結果累計:

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

參考

  1. 維基百科:函數式編程
  2. byvoid:APIO講稿——函數式編程
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容