发布于2019-08-17 16:37 阅读(1461) 评论(0) 点赞(23) 收藏(1)
这大概算是Python最难啃的一块骨头吧。在我Python生涯的这一年里,我遇到了一些Pythoner,他们毫无例外地完全不会使用函数式编程(有些人喜欢称为Pythonic),比如,从来不会传递函数,不知道lambda是什么意思,知道列表展开但从来不知道用在哪里,对Python不提供经典for循环感到无所适从,言谈之中表现出对函数式风格的一种抗拒甚至厌恶。
我尝试剖析这个问题,最终总结了这么两个原因:1、不想改变,认为现有的知识可以完成任务;2、对小众语言的歧视,Python目前在国内市场份额仍然很小很小,熟悉Python风格用处不大。
然而我认为,学习使用一种截然不同的风格可以颠覆整个编程的思想。我会慢慢总结一个系列共4篇文字,篇幅都不大,轻松就能看完,希望对喜欢Python的人们有所帮助,因为我个人确实从中受益匪浅。
还是那句老话,尊重作者的劳动,转载请注明原作者和原地址:)
函数式编程使用一系列的函数解决问题。函数仅接受输入并产生输出,不包含任何能影响产生输出的内部状态。任何情况下,使用相同的参数调用函数始终能产生同样的结果。
在一个函数式的程序中,输入的数据“流过”一系列的函数,每一个函数根据它的输入产生输出。函数式风格避免编写有“边界效应”(side effects)的函数:修改内部状态,或者是其他无法反应在输出上的变化。完全没有边界效应的函数被称为“纯函数式的”(purely functional)。避免边界效应意味着不使用在程序运行时可变的数据结构,输出只依赖于输入。
可以认为函数式编程刚好站在了面向对象编程的对立面。对象通常包含内部状态(字段),和许多能修改这些状态的函数,程序则由不断修改状态构成;函数式编程则极力避免状态改动,并通过在函数间传递数据流进行工作。但这并不是说无法同时使用函数式编程和面向对象编程,事实上,复杂的系统一般会采用面向对象技术建模,但混合使用函数式风格还能让你额外享受函数式风格的优点。
函数式的风格通常被认为有如下优点:
支持函数式编程的语言通常具有如下特征,大量使用这些特征的代码即可被认为是函数式的:
1 2 3 4 5 6 7 8 9 | #伪代码 interface Comparator { compare(o1, o2) } lst = list ( range ( 5 )) lst.sort(Comparator() { compare(o1, o2) { return o2 - o1 / / 逆序 }) |
1 2 3 4 | def compare(o1, o2): return o2 - o1 #逆序 lst = list ( range ( 5 )) lst.sort(compare) |
1 | lst.sort( lambda o1, o2: o1.compareTo(o2)) |
1 2 3 4 | lst2 = list () for i in range ( len (lst)): #模拟经典for循环 if lst[i] > 0 : lst2.append(lst[i]) |
1 | lst2 = filter ( lambda n: n > 0 , lst) |
1 2 3 4 5 6 7 8 9 | class greater_than_helper: def __init__( self , minval): self .minval = minval def is_greater_than( self , val): return val > self .minval def my_filter(lst, minval): helper = greater_than_helper(minval) return filter (helper.is_greater_than, lst) |
1 2 | def my_filter(lst, minval): return filter ( lambda n: n > minval, lst) |
<第一节完>
作者:j878
链接:https://www.pythonheidong.com/blog/article/47773/351dfdf1d84707f97d17/
来源:python黑洞网
任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任
昵称:
评论内容:(最多支持255个字符)
---无人问津也好,技不如人也罢,你都要试着安静下来,去做自己该做的事,而不是让内心的烦躁、焦虑,坏掉你本来就不多的热情和定力
Copyright © 2018-2021 python黑洞网 All Rights Reserved 版权所有,并保留所有权利。 京ICP备18063182号-1
投诉与举报,广告合作请联系vgs_info@163.com或QQ3083709327
免责声明:网站文章均由用户上传,仅供读者学习交流使用,禁止用做商业用途。若文章涉及色情,反动,侵权等违法信息,请向我们举报,一经核实我们会立即删除!