水管模型

这一章,我们要回到一个问题,到底函数式和过程式的编程思路到底在哪里?我们这里提供一个形象的比喻。

过程式--屋子物件

过程式思维里,每一个可变变量、函数/过程指称的符号,类似告诉你一个屋子的名字。对一个静态语言来说,我们可能还需要屋子里只能放什么东西。

然后,我们每一次调用一次函数/过程,就是将对对应屋子里的函数取出来,以及其他屋子里的物件取出来,按照函数的方式重新整理,把结果放到原先的屋子或者新的屋子里。(注意这个描述和图灵机其实是类似的。)

但是,这个屋子可能会更复杂,我们可能有时候会参考别的屋子里的情况,甚至另一栋房子里的屋子(其他模块、第三方插件),或者甚至是天气和社会新闻(环境变量、硬件)来盘算每一次整理物件的逻辑(即函数)。

这个是「屋子-物件」模型中,最让人困惑的事。如果你天气不好,或者别的屋子的情况有问题,你的整理物件的规则可能就有很大的问题,而且溯因是困难的。这个我们也在001中介绍过这个问题。

函数式--水管和数据流

在函数式编程中,我们的模型是编造一些列的水管,水管就是函数式中的函数。我们的目标就是事先将各种函数水管给架设好管道系统。然后将水(数据/不可变参数)倒入进去,等待水管的另一头流出结果就好了。

compose

我们到目前为止,可以想到的最简单的就是将水管相连。比如,在做文本处理的时候,我们很有可能会有以下的操作。这个就是典型的水管拼接的过程,我们只需要维护分词变小写删除stopword词干化这几个函数即可。

当然,我们可以一步步把水倒到水管里,取出来再倒到另一个水管。那何不我们就直接事先帮水管串起来。这个操作也被称为compose(用符号\circ∘表示)。

我们给出一个简单的Python实现:

from functools import reducedef compose(*args):"""数学中的compose>>> from fppy.base import compose>>> compose(lambda x: x+1, lambda x: x**2)(1)>>> 4"""return reduce(lambda f, g: lambda x: f(g(x)), args, lambda x: x)

比如我们就可以把下面的f1f2f3给串起来了:

>>> f1 = lambda x: x + 1
>>> f2 = lambda y: y * 2
>>> f3 = lambda z: z / 3>>> compose(f3, f2, f1)(1)
1.3333333333333333>>> h(g(f(1)))
1.3333333333333333

不过有时候,compose的顺序会让人困惑,我个人喜欢下面and_then的表述:

def and_then(*args):return reduce(lambda f, g: lambda x: g(f(x)), args)

对我个人而言这样子会更明确:

>>> and_then(f, g, h)(1)
1.3333333333333333

如果您想开发小程序或者APP软件,可以通过专业开发公司,来帮助你实现开发需求:厦门在乎科技-专注厦门小程序定制开发、APP开发、网站开发、h5小游戏开发

Python函数式编程系列002:水管模型和compose相关推荐

  1. 函数式编程语言python-10分钟学会python函数式编程

    原标题:10分钟学会python函数式编程 在这篇文章里,你将学会什么是函数范式以及如何使用Python进行函数式编程.你也将了解列表推导和其它形式的推导. 函数范式 在命令式范式中,通过为计算机提供 ...

  2. Python函数式编程——map()、reduce()

    提起map和reduce想必大家并不陌生,Google公司2003年提出了一个名为MapReduce的编程模型[1],用于处理大规模海量数据,并在之后广泛的应用于Google的各项应用中,2006年A ...

  3. python函数式编程读取数据-python学习笔记9:函数式编程

    函数式编程(FunctionalProgramming) 基于lambda演算的一种编程方式 程序中只有函数 函数可以作为参数,同样可以作为返回值 纯函数式编程语言: LISP, Haskell Py ...

  4. python编写函数_浅谈Python 函数式编程

    匿名函数lambda表达式 什么是匿名函数? 匿名函数,顾名思义就是没有名字的函数,在程序中不用使用 def 进行定义,可以直接使用 lambda 关键字编写简单的代码逻辑.lambda 本质上是一个 ...

  5. Python函数式编程简介(二)返回函数

    本文为Python函数式编程的第二部分主要讲解返回函数和闭包 2.返回函数 2.1.函数作为返回值 高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回. 我们来实现一个可变参数的求和.通常 ...

  6. Python函数式编程简介(一)高阶函数

    本文概括介绍Python函数式编程的一些概念及用法,详细请参考: https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df ...

  7. python采用函数编程模式_浅谈Python 函数式编程

    匿名函数lambda表达式 什么是匿名函数? 匿名函数,顾名思义就是没有名字的函数,在程序中不用使用 def 进行定义,可以直接使用 lambda 关键字编写简单的代码逻辑.lambda 本质上是一个 ...

  8. Python 函数式编程,从入门到放弃

    很早以前就听说过了函数式编程,印象中是一种很晦涩难懂的编程模式,但却一直没有去进行了解. 恰好这周组内的周会轮到我主持,一时也没想到要分享什么.灵光一闪,就选定函数式编程这个主题吧,反正组里的同事都没 ...

  9. python采用函数式编程模式-浅谈Python 函数式编程

    匿名函数lambda表达式 什么是匿名函数? 匿名函数,顾名思义就是没有名字的函数,在程序中不用使用 def 进行定义,可以直接使用 lambda 关键字编写简单的代码逻辑.lambda 本质上是一个 ...

最新文章

  1. ICLR2020 | 谷歌最新研究:用“复合散度”量化模型合成泛化能力
  2. JVM启动的时候,默认加入的属性
  3. Python super超类方法
  4. 机器学习——图解SVM中gamma和c参数的作用
  5. QT Openssl no OPENSSL_Applink 解决
  6. 【Clickhouse】Clickhouse 数据字典
  7. jQuery自定义的属性内容包含单引号、双引号,页面显示异常
  8. SQL语句基本增删改查操作总结
  9. 【原创】《矩阵的史诗级玩法》连载十四:二元二次方程和圆锥曲线
  10. [GIS教程] 5.2 空间数据管理 | SDE空间数据引擎
  11. 视频flv转mp4最快的几种方法(就是不用格式工厂)
  12. 周报,当前是第几周 ?
  13. Excel筛选重复数据
  14. POI在指定excel插入行java
  15. 研究发现有适用于欧洲GDPR法规的加密货币解决方案
  16. ios虚拟机运行速度_iOS 8的采用速度减慢至虚拟停止
  17. 交叉编译ssh服务到ARM开发板
  18. 软件测试的前景怎么样?要不要转行软件测试?
  19. 详解容灾架构中的数据复制技术
  20. 京东云linux面板脚本,京东疯狂的joy脚本

热门文章

  1. 如何处理 Java 中的 NumberFormat 异常
  2. 学校举行“甲骨文华育兴业大数据中心,甲骨文行业人才培养基地”挂牌仪式
  3. MySQL中的时区设置
  4. 【IEEE论文投稿word中双栏情况下插入单栏效果图片】
  5. C51单片机实验——脉冲计数显示(proteus+asm)
  6. 【路径规划-PRM路径规划】基于RRT算法避障路径规划附完整matlab代码
  7. python中值滤波算法_Python扩展库scipy中值滤波算法的应用
  8. C#使用SetupAPI获取设备管理器相关信息
  9. Spark Shark Tachyon 简介
  10. Shadow effect with custom shapes