在 python 编程中大量使用函数式风格,推荐吗? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
momentum
V2EX    Python

在 python 编程中大量使用函数式风格,推荐吗?

  •  
  •   momentum 2016-12-01 22:11:56 +08:00 3934 次点击
    这是一个创建于 3242 天前的主题,其中的信息可能已经有所发展或是发生改变。

    近半年读了较多函数式编程的书,算是彻底迷上了函数式编程,由于自己用 python 比较多,现在在 python 编程中也喜欢使用大量的函数式编程风格,有时可以写得很优美,有时则会显得比较令人费解。很多文章说 python 并不是一门很好的函数式编程语言,函数式编程风格也不那么的 pythonic ,所以不推荐在 python 中大量使用函数式风格。所以,大家怎么看这个问题?

    11 条回复    2016-12-02 23:16:47 +08:00
    metaquant
        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 是一门通用性语言,在不同的社区中的的最佳实践是大相径庭的。个人意见,仅供参考。
    westworld
        2
    westworld  
       2016-12-01 22:31:18 +08:00
    @metaquant 有道理,我也感觉编程风格方面不能钻牛角尖,写出健壮、易读、直观的代码才是最重要的
    momentum
        3
    momentum  
    OP
       2016-12-01 22:39:19 +08:00
    @westworld 这里存在一个度的问题,比较难把握
    alphabeta
        4
    alphabeta  
       2016-12-01 22:45:46 +08:00
    不推荐,要学函数式编程,建议直接上 Haskell ,才能学到函数式编程的精髓
    stamaimer
        5
    stamaimer  
       2016-12-01 22:46:02 +08:00 via iPhone
    同意二楼
    thekoc
        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
    ericls
        7
    ericls  
       2016-12-01 23:38:30 +08:00 via iPhone
    据说 Python function call 有 overhead
    strahe
        8
    strahe  
       2016-12-01 23:56:51 +08:00
    不推荐,别的不说,举个例子,我现在接手的项目就是大量的函数式,从代码的风格上来说很多与 python 的特性想违背,很不友好,(至少从大部分人的角度来看是这样的)
    zhuangzhuang1988
        9
    zhuangzhuang1988  
       2016-12-02 00:33:32 +08:00
    没必要, 不推荐。。
    msg7086
        10
    msg7086  
       2016-12-02 05:34:48 +08:00
    如果你想玩函数式,为什么不从 Ruby 开始玩起呢?强势安利一发 Ruby 。
    102400
        11
    102400  
       2016-12-02 23:16:47 +08:00
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2491 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 34ms UTC 11:08 PVG 19:08 LAX 04:08 JFK 07:08
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86