Skip to content

Latest commit

 

History

History
49 lines (30 loc) · 2.96 KB

结语.md

File metadata and controls

49 lines (30 loc) · 2.96 KB

结语

匿名函数的问题

除了Python独有的句法上的局限,在任何一门语言中,匿名函数都有一个严重的缺点--没有名称. 函数有名称,栈跟踪更易于阅读.匿名函数是一种便利的简洁方式,人们乐于使用它们,但是有时会忘乎所以, 尤其是在鼓励深层嵌套匿名函数的语言和环境中,如JavaScriptNode.js. 匿名函数嵌套的层级太深,不利于调试和处理错误.Python中的异步编程结构更好,或许就是因为lambda表达式有局限

关于函数式编程(Functional programming)

函数式编程最近忽然大火,其实是个很老的东西.首先函数式编程是一种编程范式,本质上来说语言无关,各种语言只有设计的时候有没有考虑这种范式的问题.就像C语言一样可以写出面向对象风格的代码一样,很多函数式编程语言也可以面向对象编程.

有一种古老的动态语言叫lisp,它很出名,也出名的难用...它可以说是函数式编程语言的老祖宗(有个更老的FLPL,不过它更像Fortran的扩展因此咱不算它). 函数式编程的大致特点是:

  • 函数是第一等公民,说简单点就是函数可以作为参数也可以作为返回值

  • 只有纯的,没有副作用的函数,才是合格的函数.说白了也就是不使用全局变量

有不少人认为python是函数式编程语言其实不然.老实说python在各个方面都是个"半吊子",它对oop和fp都是只使用了一些其中的思想让其可以有限的支持这种范式而已.比如说:

  • python的匿名函数内部只能使用表达式,这大大限制了其使用范围.
  • python没有const这种关键字来指示常量
  • python的递归有深度限制等
  • 没有柯理化

然而这种'半吊子'个人认为很实用,可以避免很多麻烦

  • js中匿名函数随处都是,代码很难维护
  • const关键字限制了代码的灵活性.也让开发者不得不对全局变量做区分
  • 递归的滥用本来就对程序没有好处,设置深度限制让递归受限也更利于程序稳定运行.
  • python不提供柯理化工具,但提供了偏函数

如果要稍微更加深入一点的理解函数式编程,可以看阮一峰大大的这篇文章这篇文章的代码是js写的,不过没关系.有点c语言基础的都能看懂,我也有篇js的攻略,虽然没怎么认真写,但还是可以粗略看看.

相关扩展和模块

  • toolz

    纯python实现的更加全面的函数式编程工具,它有个分支项目cytools

  • funcy

    一个更加偏向实用的函数式编程库,提供了不少实用的装饰器

  • calysto_scheme

    scheme是一个lisp的方言,这个项目是一个scheme的pyhton实现,可以调用python中的模块....性能不要有期待