函数式编程的核心就是把函数当成对象来进行编程。 函数式编程(FP)是一种基于λ演算的编程范式, 它将计算视为数学函数的求值过程。其核心哲学是:
- 表达式优先:所有代码都是表达式,都有返回值
- 无副作用:函数不改变外部状态,只返回计算结果
- 确定性:相同输入必定产生相同输出
方法
有两个常用到的方法: map/reduce
, filter
,其中 map
和 filter
是内建方法,
而 reduce
不是,所以需要 import
相关模块。
map
接收两个参数,第一个参数是函数(处理办法),第二个参数是一个可迭代对象,
而 map
可以把第二个参数的变量映射到函数中一一进行处理,结果以 list
形式返回。
def f(x):
return x*x
r = map(f,[1,2,3,4,5,6])
list(r)
[1, 4, 9, 16, 25, 36]
reduce
接收两个参数,第一个参数是函数(处理办法),第二个参数是一个可迭代对象,
而 reduce
可以把第二个参数每一次 next
方法执行的结果映射到函数中进行处理,
然后返回一个计算后的值。其实质就是不断的嵌套把此层函数作为下一层函数的参数直到最后。
from functools import reduce
def add(x,y):
return x+y
reduce(add,[1,3,4,7,9])
24
reduce(add,[1])
1
filter
接收两个参数,第一个参数是函数(处理办法),第二个参数是一个可迭代对象,
而 map
可以把第二个参数的变量映射到函数中,根据 true/false
过滤,
结果以 list
形式返回。
def is_odd(n):
return n % 2 == 1
list(filter(is_odd, (1, 2, 4, 5, 6, 9, 10, 15)))
[1, 5, 9, 15]
使用元组代替列表。
point = (1, 2)
"修改"实际创建新对象。
new_point = (point[0] + 1, point[1])
使用frozendict
(Python 3.9+)。
from types import MappingProxyType
immutable_dict = MappingProxyType({'a': 1, 'b': 2})
- 函数组合的高级模式
from functools import reduce
def compose(*funcs):
return reduce(lambda f, g: lambda x: f(g(x)), funcs)
使用示例:
process = compose(str.upper, lambda s: s.strip(), str)
process(" hello ")
'HELLO'
- Monad概念实践
Maybe Monad的Python实现。
class Maybe:
def __init__(self, value):
self.value = value
def bind(self, func):
return Maybe(func(self.value)) if self.value is not None else self
def __repr__(self):
return f"Maybe({self.value})"
Maybe(5).bind(lambda x: x*2).bind(lambda x: x+1)
Maybe(11)
函数式编程正在从学术走向工业实践,React Hooks、Redux等流行框架都深受FP影响。 掌握其精髓能让开发者写出更健壮、更易维护的代码, 特别是在并发处理和复杂业务逻辑领域展现出独特优势。 现代开发者应当根据项目需求,灵活选择命令式、面向对象与函数式的适当组合。