这章开始讨论Python的函数。在Python中,函数是一等对象,怎么理解这个概念?定义是这样的:

  • 在运行时创建
  • 能赋值给变量或数据结构中的元素
  • 能作为参数传给函数
  • 能作为函数的返回结果

我强烈建议,看这章内容的时候,对比一下JavaScript的函数实现,特别是函数式编程部分。个人认为,JavaScript/Python的函数实现都优于PHP。

函数式一等对象,有什么意义?它意味着你可以使用函数式编程范式。过程化->面向对象->函数式,编程范式一直在根据环境和实际需求在演化。而JavaScript生逢其时,赶上好时候了。参见我的文章:为什么是JavaScript? 

同时我推荐一本图灵出版的小书《函数式编程思维》,书内容不多,但是很精炼。关于JavaScript函数式编程,也有专门的一本书在讨论,这里:作者提炼出几个基本的函数式编程构造单元:filter/map/reduce. 是不是看着很眼熟?Python对这些函数支持的很好。不过,因为Python有列表表达式支持,很多地方已经可以用更高效的列表表达式替代这些函数调用,而reduce则基本被sum替代了。

函数式编程是指为创建不可变的程序,通过消除外部可见的副作用,来对纯函数的声明式的求值过程.

函数式程序员喜欢用少数几个核心数据结构,围绕它们去建立一套充分优化的运转机构。面向对象程序员喜欢不断地创建新的数据结构和附属的操作,因为压倒一切的面向对象编程范式就是建立新的类和类间的消息。把所有的数据结构都封装成类,一方面压制了方法层面的重用,另一方面鼓励了大粒度的框架式的重用。函数式编程的程序构造更方便我们在比较细小的层面上重用代码。

以上两段来自函数式编程的两本参考资料。

Python语言因为句法限制:换行、对齐,所以lambda函数是有限制的,能使用的语句比较简单,可以称得上简陋。相比之下,JavaScript的设计就好用多了。参见:JavaScript箭头函数 。Java的lambda函数支持,句法跟JavaScript惊人的相似。

这章内容还探讨了可调用对象 – 通过实现__call__方法、函数不定长多参数、函数注解等问题。

Python为函数式编程提供了operator、functools等包支持。这些包为常见的操作提供了实现,使用时就不用写麻烦的lambda函数了,而且lambda的限制也可以得到弥补和解决。具体请参考文档和实例。另外,可以参考Python Cookbook 第三版第7章节,作为本章补充。这里需要说明的是:函数式编程不是句法问题,而是编程思维的转换,这点才是至关重要的,也是主要的编程障碍。

 

 

流畅的Python-Fluent Python读书笔记-06-使用一等函数实现设计模式
Dependency Injection-依赖注入详解