Python函数式编程
纸上得来终觉浅,绝知此事要躬行。

1. 基础知识
函数式编程(functional programming)是一种编程范式。
理解函数式编程的行为
- 函数式编程不依赖于外部变量,而是返回一个新的值给你,所以没有任何副作用。即保证每次输入的值不变,输出的值一定也不会发生改变。
- 非函数式编程中my_inc会修改全局变量中的x变量的值,而函数式编程中my_inc只依赖于我们输出时传入的x值,给出我们计算之后的值,不依赖于外部变量。
# 非函数式编程 In [1]: x = 1 In [2]: def my_inc(): ...: global x ...: x += 1 ...: In [3]: my_inc() In [4]: x Out[4]: 2
# 函数式编程 In [5]: def my_inc(x): ...: return x + 1 ...: In [6]: x = 1 In [7]: my_inc(x) Out[7]: 2
函数式编程的主要特征
- 函数是一等公民
- 所有和数据相关的事情都可以通过函数自身来解决。函数就像变量一样用来使用,函数可以像变量一样被创建、删除和修改,并当成变量一样传递,返回或是在函数中嵌套函数。
- 递归作为主要控制结构
- 函数式编程的循环控制等操作,基本都是使用递归进行完成的。
- 关注列表处理
- 列表处理(lisp)经常被用于子列表的递归来替代循环。
- 避免变量副作用
- 纯函数式编程语言会避免命令式语言中先赋值给一个变量,而另一个相同变量来跟踪程序状态这样的副作用,即所求即所得。
- 完全不允许声明
- 函数式编程不鼓励或完全不允许声明,替而代之的是表达式求值,即函数+参数的方式。通常情况下,一个程序就是一个表达式。
- 关注于计算本身
- 函数式编程担忧的是计算什么,而不是如何计算。所以你的代码变成了在描述你要干什么,而不是怎么去干
- 许多函数式编程利用高阶函数
- 之前我们学习的map、reduce、filter等都是高阶函数。