第 8 章 函数式编程

函数式编程并不是考虑使用Python时需要考虑的首要问题,但Python对函数式编程的支持确实存在而且相当广泛。尽管许多Python程序员并没有意识到这一点,这有点儿难堪:除了少数情况,函数式编程可以让你写出更为精确和高效的代码。

在以函数式风格写代码时,函数应该设计成没有其他副作用。也就是说,函数接收参数并生成输出而不保留任何状态或修改任何不反映在返回值中的内容。遵循这种理想方式的函数可以被看成纯函数式函数。

广告:个人专属 VPN,独立 IP,无限流量,多机房切换,还可以屏蔽广告和恶意软件,每月最低仅 5 美元

一个非纯函数

def remove_last_item(mylist):
  """Removes the last item from a list."""
  mylist.pop(-1) # This modifies mylist

一个纯函数

def butlast(mylist):
  """Like butlast in Lisp; returns the list without the last element."""
  return mylist[:-1] # This returns a copy of mylist

函数式编程具有以下实用的特点。

 
  • 可形式化证明。诚然,这只是个纯理论的优点,没有人会用数学方法去证明一个Python程序。
  • 模块化。模块化编码能够在一定程度上强制对问题进行分治解决并简化在其他场景下的重用。
  • 简洁。函数式编程通常比其他范型更为简洁。
  • 并发。纯函数式函数是线程安全的并且可以并行运行。尽管在Python中还没实现,但期待一些语言能够自动进行处理,这在需要扩展应用程序时非常有用。
  • 可测性。测试一个函数式程序是非常简单的:所有需要做的仅仅是一组输入和一组期望的输出。而且是幂等的。

 提示

如果想要更严谨的函数式编程,那么请参考我的建议:暂时从Python中跳出来放松一下,去学习Lisp。我知道在一本Python书里谈Lisp很奇怪,但是这么多年同Python打交道的经验告诉我如何“函数式地思考”。如果你所有的经验都来自于命令式编程和面向对象编程,将很难拓展那种要充分利用函数式编程的思维过程。Lisp本身也并非纯函数式,但是它比Python要更关注函数式编程。