除了Python独有的句法上的局限,在任何一门语言中,匿名函数都有一个严重的缺点--没有名称.
函数有名称,栈跟踪更易于阅读.匿名函数是一种便利的简洁方式,人们乐于使用它们,但是有时会忘乎所以,
尤其是在鼓励深层嵌套匿名函数的语言和环境中,如JavaScript
和Node.js
.
匿名函数嵌套的层级太深,不利于调试和处理错误.Python中的异步编程结构更好,或许就是因为lambda
表达式有局限
函数式编程最近忽然大火,其实是个很老的东西.首先函数式编程是一种编程范式,本质上来说语言无关,各种语言只有设计的时候有没有考虑这种范式的问题.就像C语言一样可以写出面向对象风格的代码一样,很多函数式编程语言也可以面向对象编程.
有一种古老的动态语言叫lisp,它很出名,也出名的难用...它可以说是函数式编程语言的老祖宗(有个更老的FLPL,不过它更像Fortran的扩展因此咱不算它). 函数式编程的大致特点是:
-
函数是第一等公民,说简单点就是函数可以作为参数也可以作为返回值
-
只有纯的,没有副作用的函数,才是合格的函数.说白了也就是不使用全局变量
有不少人认为python是函数式编程语言其实不然.老实说python在各个方面都是个"半吊子",它对oop和fp都是只使用了一些其中的思想让其可以有限的支持这种范式而已.比如说:
- python的匿名函数内部只能使用表达式,这大大限制了其使用范围.
- python没有const这种关键字来指示常量
- python的递归有深度限制等
- 没有柯理化
然而这种'半吊子'个人认为很实用,可以避免很多麻烦
- js中匿名函数随处都是,代码很难维护
- const关键字限制了代码的灵活性.也让开发者不得不对全局变量做区分
- 递归的滥用本来就对程序没有好处,设置深度限制让递归受限也更利于程序稳定运行.
- python不提供柯理化工具,但提供了偏函数
如果要稍微更加深入一点的理解函数式编程,可以看阮一峰大大的这篇文章这篇文章的代码是js写的,不过没关系.有点c语言基础的都能看懂,我也有篇js的攻略,虽然没怎么认真写,但还是可以粗略看看.
-
纯python实现的更加全面的函数式编程工具,它有个分支项目cytools
-
一个更加偏向实用的函数式编程库,提供了不少实用的装饰器
-
scheme是一个lisp的方言,这个项目是一个scheme的pyhton实现,可以调用python中的模块....性能不要有期待