Atitit 函数式编程与命令式编程的区别attilax总结  qbf

Atitit 函数式编程与命令式编程的区别attilax总结  qbf

1.1. 函数式程序就是一个表达式。命令式程序就是一个冯诺依曼机的指令序列。

命令式编程是面向计算机硬件的抽象,有变量(对应着存储单元),赋值语句(获取,存储指令),表达式(内存引用和算术运算)和控制语句(跳转指令),一句话,命令式程序就是一个冯诺依曼机指令序列

而函数式编程是面向数学的抽象,将计算描述为一种表达式求值,一句话,函数式程序就是一个表达式

1.2. 面向对象语言中,数据类型分为两种——基本类型和对象类型(即class)。 
函数式语言中,数据类型也分为两种——基本类型和函数类型。

面向对象语言中,基本类型都是固定类型,没什么发挥余地;我们主要关注的是可以自定义的对象类型(class)。同样,函数式语言中,我们关注的是可以自定义的函数类型

1.3. Oo,以数据为中心,op围绕数据。。Fp相反

oop, 就是让operation 围绕data, 这样的好处是,当你要添加新的data type的时候,好方便! 原来写的代码都不用改。 但是你要给已经写好的data type添加方法怎么办? 比如我要你给java自带的string 加个 python那种乘法。
functional programming采取的是另一种思路,data更多的围绕operation, 所以添加新的方法很容易。
这就是著名的the expression problem. 谁优谁劣,要看应用场景,写GUI用oop好不畅快,写interpreter我更喜欢函数式的。

1.4. 函数式编程严重依赖递归。

同样由于变量不可变,纯函数编程语言无法实现循环,这是因为For循环使用可变的状态作为计数器,而While循环DoWhile循环需要可变的状态作为跳出循环的条件。因此在函数式语言里就只能使用递归来解决迭代问题,这使得函数式编程严重依赖递归。

1.5. 递推(iterative)递归(recursive)两种定义

一般来说,递归这种方式于循环相比被认为是更符合人的思维的,即告诉机器做什么,而不是告诉机器怎么做。递归还是有很强大的表现力的,比如换零钱问题。

1.6. 一般来说,递归这种方式于循环相比被认为是更符合人的思维的..为什么递归下降法比循环好了和。。

1.7. 函数式程序是可以保存状态的,只不过它们用的不是变量,而是函数。

状态保存在函数的参数中,也就是说在栈上。如果你需要保存一个状态一段时间并且时不时的修改它,那么你可以编写一个递归函数

1.8. pattern match

模式匹配的case of 语句。

1.9. 函数式语言其实就是模仿人的数学思维而发明的朴素,后来因为离机器太远,不容易优化而被诟病。

但科技发展到今天,编译器的优化能力已经很强,软件系统越来越复杂,人的分工越来越细,函数式语言离数学更近,离机器更远,反而成为一种优势,有助于人把问题清晰化。从这个层面看,函数式编程是一种什么思维,就是推离机器的数学思维。这里没有内存、寄存器的想法,在 a=1之后,a 就不可能再等于2,当然你可以在 let a = 1 之后,再 let a = 2,但是这个a 就已经不是那个

函数是Python内建支持的一种封装,我们通过把大段代码拆成函数,通过一层一层的函数调用,就可以把复杂任务分解成简单的任务,这种分解可以称之为面向过程的程序设计。函数就是面向过程的程序设计的基本单元。

1.9.1. 函数式语言curry 柯里化

作者:: 绰号:老哇的爪子 ( 全名::Attilax Akbar Al Rapanui 阿提拉克斯 阿克巴 阿尔 拉帕努伊 )

汉字名:艾提拉(艾龙),   EMAIL:[email protected]

转载请注明来源: http://www.cnblogs.com/attilax/

Atiend

时间: 2024-12-28 08:46:42

Atitit 函数式编程与命令式编程的区别attilax总结  qbf的相关文章

函数式编程 vs 命令式编程

函数式编程 vs 命令式编程 函数式编程属于声明式编程(Declarative Programming),SQL就是典型的声明式编程. 函数式编程(Functional Programming) 关注行为 强调what,对应于数学里面的函数的对应法则. 像餐馆里吃饭,提出自己的要求即可 数学函数概念含有三个要素:定义域A.值域C和对应法则f.其中核心是对应法则f,它是函数关系的本质特征. 命令式编程(Imperative Programming) 关注数据 强调how,每一步都需要去做 像在家里

函数式编程和命令式编程

所谓命令式编程,是以命令为主的,给机器提供一条又一条的命令序列让其原封不动的执行.程序执行的效率取决于执行命令的数量.因此才会出现大O表示法等等表示时间空间复杂度的符号. 而函数式语言并不是通常意义上理解的“通过函数的变换进行编程”.注意到纯的函数式语言中是没有变量的(没有可以改变的东西,所有的东西在定义以后就都是不变的),那么这样的东西有什么好处呢?就比如,如果所有的东西都是不变的,那么我们又怎么进行编程呢? 实际上,我们在函数式编程中进行构建的是实体与实体之间的关系.在这种意义上,lisp虽

编程范式:命令式编程(Imperative)、声明式编程(Declarative)和函数式编程(Functional)

主要的编程范式有三种:命令式编程,声明式编程和函数式编程. 命令式编程:命令式编程的主要思想是关注计算机执行的步骤,即一步一步告诉计算机先做什么再做什么.比如:如果你想在一个数字集合 collection(变量名) 中筛选大于 5 的数字,你需要这样告诉计算机:第一步,创建一个存储结果的集合变量 results:第二步,遍历这个数字集合 collection:第三步:一个一个地判断每个数字是不是大于 5,如果是就将这个数字添加到结果集合变量 results 中.代码实现如下: List<int>

Atitit 面向对象编程(OOP)、面向组件编程(COP)、面向方面编程(AOP)和面向服务编程(SOP)的区别和联系

Atitit 面向对象编程(OOP).面向组件编程(COP).面向方面编程(AOP)和面向服务编程(SOP)的区别和联系 1. 面向组件编程(COP) 所以,组件比起对象来的进步就在于通用的规范的引入.通用规范往往能够为组件添加新的能力(就像上面所讨论的), COP比OOP更进一步.通常OOP将数据对象组织到实体中.这种方法具有很多优点.但是,OOP有一个大的限制:对象之间的相互依赖关系.去掉这个限制的一个好的想法就是组件.组件和一般对象之间的关键区别是组件是可以替代的. 3.什么是面向方面编程

命令式编程vs声明式编程

英文原文:Imperative vs Declarative 先统一一下概念,我们有两种编程方式:命令式和声明式. 我们可以像下面这样定义它们之间的不同: 命令式编程:命令"机器"如何去做事情(how),这样不管你想要的是什么(what),它都会按照你的命令实现. 声明式编程:告诉"机器"你想要的是什么(what),让机器想出如何去做(how). 声明式编程和命令式编程的代码例子举个简单的例子,假设我们想让一个数组里的数值翻倍. 1.我们用命令式编程风格实现,像下面

声明式编程与命令式编程

先统一一下概念,我们有两种编程方式:命令式和声明式. 我们可以像下面这样定义它们之间的不同: ·命令式编程:命令“机器”如何去做事情(how),这样不管你想要的是什么(what),它都会按照你的命令实现.·声明式编程:告诉“机器”你想要的是什么(what),让机器想出如何去做(how). 声明式编程和命令式编程的代码例子: 举个简单的例子,假设我们想让一个数组里的数值翻倍. 我们用命令式编程风格实现,像下面这样: var numbers = [1,2,3,4,5] var doubled = [

Atitit.&#160;Async&#160;await&#160;优缺点&#160;异步编程的原理and实现&#160;java&#160;c#&#160;php

Atitit. Async await 优缺点 异步编程的原理and实现 java c# php 1. async & await的来源1 2. 异步编程history1 2.1. 线程池 2 2.2. 返回值2 2.3. Semaphore 信号量2 2.4. 线程的异常,主线程可以捕获到么2 3. await并不是针对于async的方法,而是针对async方法所返回给我们的Task,2 4. Java里面的task 跟个 await3 5. ---code4 6. async & aw

python编程:函数式编程和面向对象编程的对比

言而简之,面向对象编程就是把函数编程外面包装一个class类,然后再把这个class类指向一个对象 而class类中的函数在这里称为方法 举个例子: 用函数式编程写出一键发送邮件的脚本: def e_mail(email,message): print('邮件发送中...') return True e_mail('[email protected]','邮件内容') 用面向对象编程写出一键发送邮件的脚本: class Foo: #e_mail称为方法 def e_mail(self,email

python_way.day7 模块(configparser,xml,shutil,subprocess)、面向对象(上)(创建类,类的构成,函数式编程与面向对象编程的选择,类的继承)

python_way.day7 1.模块 configparser,xml,shutil,subprocess 2.面向对象(上) 创建类,类的构成,函数式编程与面向对象编程的选择,类的继承 1.模块 configparser 用于处理特定格式的文件,其本职上使用open来操作,只能是  [test1] 特定的格式 [test1] k1 = 123 k2 = True [test2] k1 = 123 k2 = v1 文件内容 1.获取 import configparser #打开文件找到文件