Python 支持函数式编程范式,这意味着你可以利用函数作为一等公民(即可以像其他数据类型一样被赋值给变量、作为参数传递给其他函数、以及作为返回值从函数中返回)的特性来编写代码。函数式编程强调使用函数来封装数据和行为,并且尽量避免使用可变状态和副作用。
函数式编程的特性
- 高阶函数:可以接受函数作为参数或返回函数的函数。
- 匿名函数:通过
lambda
表达式创建的简单函数。 - 函数组合:将多个函数组合成一个新的函数。
- 不可变性:尽可能使用不可变的数据结构(如元组、集合、字典的视图等)。
- 递归:利用函数自身来解决问题。
- 偏函数:通过
functools.partial
创建的函数,它预填充了一些参数。
Python 中的函数式编程示例
1. 高阶函数
def apply_twice(func, value):
"""返回func(func(value))"""
return func(func(value))
def add_five(x):
"""返回x + 5"""
return x + 5
print(apply_twice(add_five, 10)) # 输出: 20
2. 匿名函数(Lambda)
pairs = [(1, 'one'), (2, 'two'), (3, 'three'), (4, 'four')]
pairs.sort(key=lambda pair: pair[1])
print(pairs) # 输出按第二个元素排序的列表
3. 函数组合
from functools import compose
def compose(f, g):
def h(x):
return f(g(x))
return h
def add_ten(x):
return x + 10
def multiply_two(x):
return x * 2
add_then_multiply = compose(multiply_two, add_ten)
print(add_then_multiply(5)) # 输出: 30
注意:functools
模块在 Python 标准库中并没有直接提供 compose
函数,但你可以自己定义它,或者使用第三方库如 toolz
。
4. 递归
def factorial(n):
if n == 0:
return 1
else:
return n * factorial(n-1)
print(factorial(5)) # 输出: 120
5. 偏函数
from functools import partial
int2str = partial(str, base=2)
print(int2str(10)) # 输出: '1010'
总结
Python 的函数式编程特性提供了强大的工具,可以用来编写更清晰、更简洁、更易于维护和测试的代码。虽然 Python 不是纯函数式编程语言(它还支持面向对象编程和过程式编程),但你可以结合使用这些不同的编程范式来编写高效且可维护的代码。