近半年读了较多函数式编程的书,算是彻底迷上了函数式编程,由于自己用 python 比较多,现在在 python 编程中也喜欢使用大量的函数式编程风格,有时可以写得很优美,有时则会显得比较令人费解。很多文章说 python 并不是一门很好的函数式编程语言,函数式编程风格也不那么的 pythonic ,所以不推荐在 python 中大量使用函数式风格。所以,大家怎么看这个问题?
1
metaquant 2016-12-01 22:26:02 +08:00 2
严格来说, python 并不是一门函数式编程语言,祖师爷 Guido 实际上并不喜欢函数式风格,现在的 PSF 对函数式风格的支持也不是很情愿,只是由于群众的呼声,才加上了一些常见的函数式编程特性,就这样, python 3 里还把 reduce 移到 functools 模块里了。
但是不可否认,函数式编程风格在解决了某些问题,特别是科学计算类的问题是非常自然的,科学计算有时只是将数学公式翻译为编程语言而已,这时,更接近数学语言的函数式编程风格更加适用与自然。在这些工作中,大量使用函数式编程风格是可行的,别人也更好理解。 在 python 中运用函数式编程,除开最基本 map, filter, reduce 几个函数要熟练外,最关键提要理解高阶函数的概念。函数式编程的核心理论就是将大问题拆分为小问题,直到拆解成某个容易解决的原始问题,这时高阶函数便起到了核心作用。 关于 python 中高阶函数的介绍,可以参见这篇译文: http://metaquant.org/python-func.html 关于如何在 python 中使用函数式编程风格,可以参考这篇文章: https://docs.python.org/2/howto/functional.html 总之,是否可以大量使用函数式编程风格,还是视你的编程领域而定,毕竟 python 是一门通用性语言,在不同的社区中的的最佳实践是大相径庭的。个人意见,仅供参考。 |
4
alphabeta 2016-12-01 22:45:46 +08:00
不推荐,要学函数式编程,建议直接上 Haskell ,才能学到函数式编程的精髓
|
5
stamaimer 2016-12-01 22:46:02 +08:00 via iPhone
同意二楼
|
6
thekoc 2016-12-01 22:47:00 +08:00
个人觉得不适合。首先, Python 的递归默认有深度限制,并且不支持尾递归。另外, Python 的 lambda 函数不能换行,这个也比较麻烦。
再看看函数式编程最为著名的三个工具: map , filter , reduce 。先说 reduce ,在 Python 2 中, reduce 是内建函数,但是在 Python 3 中却放到了 functools 模块里。再看 map 和 filter , Python 中完全被列表推导式替代了,可以说几乎没什么地位。 另外,再看看 Python 创始人对递归的一些评论: > Third, I don't believe in recursion as the basis of all programming. This is a fundamental belief of certain computer scientists, especially those who love Scheme and like to teach programming by starting with a "cons" cell and recursion. But to me, seeing recursion as the basis of everything else is just a nice theoretical approach to fundamental mathematics (turtles all the way down), not a day-to-day tool. 虽然递归不是函数式编程的全部,但是字里行间可以感受出来他对函数式编程是不太友好的……所以 Python 的设计哲学中函数式编程可能也不会占太大的位置。 文章链接: http://neopythonic.blogspot.jp/2009/04/tail-recursion-elimination.html |
7
ericls 2016-12-01 23:38:30 +08:00 via iPhone
据说 Python function call 有 overhead
|
8
strahe 2016-12-01 23:56:51 +08:00
不推荐,别的不说,举个例子,我现在接手的项目就是大量的函数式,从代码的风格上来说很多与 python 的特性想违背,很不友好,(至少从大部分人的角度来看是这样的)
|
9
zhuangzhuang1988 2016-12-02 00:33:32 +08:00
没必要, 不推荐。。
|
10
msg7086 2016-12-02 05:34:48 +08:00
如果你想玩函数式,为什么不从 Ruby 开始玩起呢?强势安利一发 Ruby 。
|