Python函数式编程

纸上得来终觉浅,绝知此事要躬行。

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等都是高阶函数。