概述¶

本章介绍函数式编程的基本概念。如您仅想学习 Python 语言的特性,可跳过本章直接查看 迭代器.

编程语言支持通过以下几种方式来解构具体问题:

大多数的编程语言都是 过程式 的,所谓程序就是一连串告诉计算机怎样处理程序输入的指令。C、Pascal 甚至 Unix shells 都是过程式语言。

在 声明式 语言中,你编写一个用来描述待解决问题的说明,并且这个语言的具体实现会指明怎样高效的进行计算。 SQL 可能是你最熟悉的声明式语言了。 一个 SQL 查询语句描述了你想要检索的数据集,并且 SQL 引擎会决定是扫描整张表还是使用索引,应该先执行哪些子句等等。

面向对象 程序会操作一组对象。 对象拥有内部状态,并能够以某种方式支持请求和修改这个内部状态的方法。Smalltalk 和 Java 都是面向对象的语言。 C++ 和 Python 支持面向对象编程,但并不强制使用面向对象特性。

函数式 编程则将一个问题分解成一系列函数。 理想情况下,函数只接受输入并输出结果,对一个给定的输入也不会有影响输出的内部状态。 著名的函数式语言有 ML 家族(Standard ML,Ocaml 以及其他变种)和 Haskell。

一些语言的设计者选择强调一种特定的编程方式。 这通常会让以不同的方式来编写程序变得困难。其他多范式语言则支持几种不同的编程方式。Lisp,C++ 和 Python 都是多范式语言;使用这些语言,你可以编写主要为过程式,面向对象或者函数式的程序和函数库。在大型程序中,不同的部分可能会采用不同的方式编写;比如 GUI 可能是面向对象的而处理逻辑则是过程式或者函数式。

在函数式程序里,输入会流经一系列函数。每个函数接受输入并输出结果。函数式风格反对使用带有副作用的函数,这些副作用会修改内部状态,或者引起一些无法体现在函数的返回值中的变化。完全不产生副作用的函数被称作“纯函数”。消除副作用意味着不能使用随程序运行而更新的数据结构;每个函数的输出必须只依赖于输入。

一些语言对纯洁性要求非常严格,以至于没有像 a=3 或 c = a + b 这样的赋值表达式,但是完全消除副作用非常困难。 比如,显示在屏幕上或者写到磁盘文件中都是副作用。举个例子,在 Python 里,调用函数 print() 或者 time.sleep() 并不会返回有用的结果;它们的用途只在于副作用,向屏幕发送一段文字或暂停一秒钟。

函数式风格的 Python 程序并不会极端到消除所有 I/O 或者赋值的程度;相反,他们会提供像函数式一样的接口,但会在内部使用非函数式的特性。比如,函数的实现仍然会使用局部变量,但不会修改全局变量或者有其他副作用。

函数式编程可以被认为是面向对象编程的对立面。对象就像是颗小胶囊,包裹着内部状态和随之而来的能让你修改这个内部状态的一组调用方法,以及由正确的状态变化所构成的程序。函数式编程希望尽可能地消除状态变化,只和流经函数的数据打交道。在 Python 里你可以把两种编程方式结合起来,在你的应用(电子邮件信息,事务处理)中编写接受和返回对象实例的函数。

函数式设计在工作中看起来是个奇怪的约束。为什么你要消除对象和副作用呢?不过函数式风格有其理论和实践上的优点:

形式证明。

模块化。

组合性。

易于调试和测试。

形式证明¶

一个理论上的优点是,构造数学证明来说明函数式程序是正确的相对更容易些。

很长时间,研究者们对寻找证明程序正确的数学方法都很感兴趣。这和通过大量输入来测试,并得出程序的输出基本正确,或者阅读一个程序的源代码然后得出代码看起来没问题不同;相反,这里的目标是一个严格的证明,证明程序对所有可能的输入都能给出正确的结果。

证明程序正确性所用到的技术是写出 不变量,也就是对于输入数据和程序中的变量永远为真的特性。然后对每行代码,你说明这行代码执行前的不变量 X 和 Y 以及执行后稍有不同的不变量 X' 和 Y' 为真。如此一直到程序结束,这时候在程序的输出上,不变量应该会与期望的状态一致。

函数式编程之所以要消除赋值,是因为赋值在这个技术中难以处理;赋值可能会破坏赋值前为真的不变量,却并不产生任何可以传递下去的新的不变量。

不幸的是,证明程序的正确性很大程度上是经验性质的,而且和 Python 软件无关。即使是微不足道的程序都需要几页长的证明;一个中等复杂的程序的正确性证明会非常庞大,而且,极少甚至没有你日常所使用的程序(Python 解释器,XML 解析器,浏览器)的正确性能够被证明。即使你写出或者生成一个证明,验证证明也会是一个问题;里面可能出了差错,而你错误地相信你证明了程序的正确性。

模块化¶

函数式编程的一个更实用的优点是,它强制你把问题分解成小的方面。因此程序会更加模块化。相对于一个进行了复杂变换的大型函数,一个小的函数更明确,更易于编写, 也更易于阅读和检查错误。

易于调试和测试¶

测试和调试函数式程序相对来说更容易。

调试很简单是因为函数通常都很小而且清晰明确。当程序无法工作的时候,每个函数都是一个可以检查数据是否正确的接入点。你可以通过查看中间输入和输出迅速找到出错的函数。

测试更容易是因为每个函数都是单元测试的潜在目标。在执行测试前,函数并不依赖于需要重现的系统状态;相反,你只需要给出正确的输入,然后检查输出是否和期望的结果一致。

组合性¶

当你编写函数式风格的程序时,你会写出很多带有不同输入和输出的函数。其中一些不可避免地会局限于特定的应用,但其他的却可以广泛的用在程序中。举例来说,一个接受文件夹目录返回所有文件夹中的 XML 文件的函数; 或是一个接受文件名,然后返回文件内容的函数,都可以应用在很多不同的场合。

久而久之你会形成一个个人工具库。通常你可以重新组织已有的函数来组成新的程序,然后为当前的工作写一些特殊的函数。

python函数式编程模式_函数式编程指引相关推荐

  1. 函数式编程 模式_函数式编程模式:食谱

    函数式编程 模式 This article targets an audience that's graduating from functional libraries like ramda to ...

  2. python语言的编程模式_一种基于Python语言的EDA开发平台及其使用方法与流程

    本发明涉及EDA开发的技术领域,尤其是指一种基于Python语言的EDA开发平台及其使用方法. 背景技术: 目前,主流的EDA设计语言Verilog HDL能实现完整的芯片硬件逻辑电路开发,但是其代码 ...

  3. 机器人编程与python语言的区别_儿童编程和机器人编程有啥区别?

    这是最全面的回答!一篇文章让你彻底了解少儿编程和机器人编程的区别! 虽然都带有"编程"二字,但少儿编程和机器人编程还是有本质区别的,有哪些不一样呢? 偷懒的家长可以直接看下面这张表 ...

  4. python智能光环板_学而思编程推出全新智能学习系统,搭配多种硬件

    少儿编程强调的是"编程思维",而并非编写程序的技术能力.编程语言是比较复杂的计算机语言,随着技术的升级持续迭代更新.因此,比起教授学生具体的编程知识与技术,更为重要的是让孩子掌握& ...

  5. python积木编程软件_积木编程下载-积木编程app下载v1.0.0-西西软件下载

    积木编程是一款专业的编程学习软件,平台为用户提供多种编程模板使用,还收纳了丰富的编程知识方便用户随时在线学习,更快掌握编程相关技能和知识,专业题库.优质课程.模拟实战都能帮助用户快速提升编程水平. 积 ...

  6. python积木编程软件_积木编程软件手机版下载

    积木编程软件是可以在线可以学习编程的软件,平台给用户提供了大量的编程学习教程,软件还支持在线编程,学习内容丰富,让用户学习起来不会枯燥乏味,就算你是零基础的小白,也可以体验到编程的乐趣. 积木编程官方 ...

  7. 扇贝python编程课_扇贝编程app下载-扇贝编程手机版python「附如何设置自由职业」 - 超好玩...

    扇贝编程app是一款学程序的初学者们都爱用的编程学习软件,软件汇集从入门到应用一应俱全.扇贝编程手机版python「附如何设置自由职业」常见的编程语言及技术教程,学习查询两不误!更有专业的编程导师手把 ...

  8. 机器人编程与python语言的区别_少儿编程和机器人编程的区别有哪些?

    少儿编程和机器人编程是目前市面上较为流行的少儿编程培训课程,对孩子逻辑思维的培养非常有益,随着家长对孩子教育的重视,如今少儿编程和机器人编程受到了广大家长的关注,究竟少儿编程和机器人编程的区别有哪些呢 ...

  9. 风变编程第18关 编程思维_动态编程变得容易

    风变编程第18关 编程思维 Imagine you have a bag of coins where each coin is of value 5 dollars and you have to ...

最新文章

  1. Linux环境下查PG库的慢sql,postgresql慢SQL
  2. 多边形面积(Area_Of_Polygons)
  3. 每日一题(26)—— 无限循环的几种形式
  4. Windows Server 2003 下安装Apache+Php+Mysql
  5. [转]Spring中property-placeholder的使用与解析
  6. C语言中188 10取模等于多少,C语言编程:任取x为十进制整数,编程将x转换成对应的八进制数后输出。...
  7. SpringBoot❤SpringClould常用注解史诗级汇总
  8. photoshop cc 2018安装破解教程
  9. 小米平板2刷哪个系统更流畅_大神教你小米平板2如何刷Windows 10系统
  10. Unity Metaverse(二)、Mixamo Animator 混合树与动画融合
  11. 八个设计师接私活的网站,你有技术就有钱
  12. 口红见缝插针小游戏的一些参数说明
  13. 攻防世界高手进阶区——dice_game
  14. 什么是抽象工厂模式?
  15. 成为一名优秀黑客的12个基本步骤
  16. 日本人又一变态爱好!¨【盆景猫】
  17. 微习惯瘦身,一天一个俯卧撑就够了吗?
  18. 电脑连接不上WiFi无线网,网络显示出现黄星号,或者感叹号最有效的解决方法:
  19. 【图像分割】基于局部信息的模糊C均值聚类算法(FLICM)实现图像分割matlab代码
  20. 苹果在中国的降价策略收到效果 销量回升了

热门文章

  1. 阿里1688直播推荐算法实践
  2. 《快速搞垮一个技术团队的20个“必杀技”》
  3. 一不小心又把应用发挂了,复盘一下这十几分钟的黑暗时刻
  4. 看完秒懂大数据用户画像!
  5. 先进先出置换算法(FIFO)
  6. tcpdf html 格式重叠,html - tcpdf(html2pdf)无法正确生成表格边框 - 堆栈内存溢出...
  7. centos7重启命令_centos7单用户模式更改root一种方法
  8. 别魔改网络了,Google研究员:模型精度不高,是因为你的Resize方法不够好!
  9. NeuralRecon:单目视频的实时Coherent 三维重建
  10. 无监督特定类别的网格重建(U-CMR) | ECCV