最近一段时间总是听到或者看到有人谈论“函数式编程”,第一次接触是在大概半年前的一次沙龙中,当时听人讲的时候,心想这有什么难理解的,函数式编程,函数嘛,那就是C呀,C++放在首位的是对象,面向对象编程,C放在首位的不是函数吗,那就是函数式编程啊,整个经验交流迷迷糊糊的,只记住了个lambda。但是在后来陆陆续续还是听到了这个名词,而且也知道并不是我理解的那个样子,C不是“函数式编程”,而是“面向过程编程”,是“命令式编程”,但是还不是很理解到底是怎么区分的。于是周末翻阅了一下资料,稍作“概念层次”的总结。

部分取自自己的笔记,出处不详...

一、基础知识

(一)编程语言(程序设计语言)的分类?

通常可分为4类:命令式语言、函数式语言、逻辑语言和面向对象的语言(实际上还有很多不同的划分版本)

1、命令式编程语言(imperative language)

计算机体系结构是影响语言设计的一个重要因素,目前的大多数语言都是围绕着冯诺依曼结构设计的,

这些语言称为“命令式语言”。

命令式语言的核心特征:

(1)变量(冯诺依曼结构的存储单元)

(2)赋值语句(数据传输)

(3)迭代形式的循环(冯诺依曼结构中实现循环的最高效形式)

2、函数式编程语言(functional language)

命令式编程语言是以冯诺依曼这种体系结构为模型,而函数式程序语言的目的是尽可能的模拟数学函数。

函数式语言的核心特征:

(1)以“函数”为首,如同命令式语言中的“变量”,函数可以赋值给其他变量,可以作为其他函数的参数,

或者作为其他函数的返回值。

(2)不修改变量的值

(3)只有表达式,没有语句。此处的语句指的是没有返回值得某些操作。

(4)引用透明(Referential transparency),函数的运行不依赖与外部变量或“状态”,简单的说就是,

同一个输入(参数),总是会产生同一个输出(返回值),这与数学函数的特征很一致。

命令式语言因为全局变量等的存在,就无法做到这一点。

(5)对比命令式语言,递归形式的循环

3、逻辑程序设计语言(logic programming language)(未研究)

逻辑程序设计语言:基于逻辑符号逻辑的语言称为逻辑程序设计语言,或者声明性语言

逻辑程序设计:用一种符号逻辑作为程序设计语言来进行程序设计,通常称为逻辑程序设计

逻辑式编程语言是基于规则的编程语言

程序是事实和规则集,通过符号逻辑表示程序,并使用逻辑推导过程来生成结果。

4、面向对象语言(object oriented language)

听起来最亲切的一个种类..........

严格来说,面向对象语言不应该处在与命令式语言并列的状态,面向对象语言的设计也是依据冯诺依曼结构,

它是从命令式语言发展而来,我觉得它本身就是命令式语言。

“面向对象”:强调的是开发模式,与它相对的开发模式就是“面向过程”

所以说就是“命令式语言”通常指的是“面向过程开发的编程语言”,比如C语言;

“面向对象语言”指的就是“面向对象开发的编程语言”,比如C++和Java。

主要特征:

(1)封装:将数据和方法封装成类

(2)继承:子类继承父类,可以自动共享父类的数据结构和方法

(3)多态:子类可以修改父类的方法

5、其他语言:

(1)脚本语言(Scripting language)(python、JavaScript等等)

脚本语言也是一类语言,只不过分类的依据与上述不同,脚本语言属于“命令式语言”的范畴

单拎出这个分类是由于其的运行方式——解释执行,没有编译过程

(2)可视化语言

同样是命令式语言的一个子类,能够以拖放的方式生成代码段(比如.NET)

(3)标记语言(markup language)(HTML、XML等)

这种语言,不算做编程语言;

但是某些标记语言(比如HTML和XML)的扩展中,也加入了一些程序设计的功能

——标记与程序设计混合语言(比如JSP标准标签库中的JSTL)

(4)还有一些特殊用途的语言等等

(二)语言执行方式?

1、编译执行——针对编译语言

简单理解,编译执行就是先将源语言(通常是高级语言)翻译成目标语言机器语言(01码),之后再执行。

源语言——>目标语言的翻译过程,包括词法分析、语法分析、语义分析多个步骤

什么是翻译,用会话语言想一下就懂了,翻译就是从一种语言换成另一种语言的过程(中文—>英文)

(我之所以在这写这么多,是因为这个简单的道理我是经过很久才悟的....)

2、完全解释执行——针对动态语言(脚本语言)

对比编译执行,就是没有翻译的过程,程序由另一个称为解释器的程序(虚拟机)解释执行。

3、混合执行——编译与完全解释的折中

源语言——(翻译)——> 中间语言——(解释执行)——>结果

引入中间语言的目的是什么呢?就是这种语言更便于解释执行

比如Java:

(1)首先,将源代码翻译成中间语言(中间形式)——字节码

(2)Java虚拟机(字节码解释器)对字节码进行解释执行

由此也可以理解,编译有两种可能性:

(1)对于编译语言来说:编译是将源代码编译成能够作用于真机的指令,生成的语言是直接作用于硬件的

(2)对于动态语言来说:编译是将源代码编译成一个中间形式,比如字节码

字节码不是作用于硬件,而是虚拟机

字节码是什么?——就是一系列的字节,每个字节表示一个指令

(三)开发环境

开发环境不难理解,是软件开发中使用的工具集

这个工具集可以只包含一个文件系统、一个文本编辑器、一个链接器和一个编译器,

也可以包含很多集成的工具,每个工具都可以通过统一的用户界面来使用。

二、函数式编程

所以什么是函数式编程呢..........................,首先再复习一下基础知识.....................................

(一)数学函数

数学函数是从一个集合到另一个集合的映射,前者称为定义域,或者称为值域。

映射过程的描述:表达式或者表

特征:

(1)映射表达式的求值顺序由递归表达式和条件表达式控制

(2)给定同一个参数,总是输出值域几个中的同一个元素

1、简单函数——函数名后跟括号内的一组参数,之后是表达式,例如:

f(x)=x*x*x,其中x是实数

此函数:

(1)定义域和值域都是实数

(2)如果执行求f(2),即参数是2,在整个求值过程中,x的值恒为2,不改变

2、λ标记法——提供了一种定义匿名函数的方法。

λ表达式:是一个匿名函数,说明了函数的参数和映射,然而此函数没有名字,

λ表达式和其他函数定义一样,可以有一个以上的参数——λ(x)x*x*x

λ计算:一个使用λ表达式的计算模型

λ计算是函数式编程语言的灵感所在

3、高阶函数——以一个或多个函数作为参数,两种类型

(1)函数组合,有两个函数参数,并生成一个函数

该函数的值是将第一个实参函数应用到第二个实参函数的结果上。

h(x)=f(g(x)); f(x)=x+2; g(x)=3*x;

(2)以单个函数为参数,可以应用到一组自变量上,结果组合成列表或者序列

h(x)=x*x;

a(h,(2,3,4))——>(4,9,16)

(二)函数式程序设计基础

最根本的一点:函数式程序设计语言的目的是尽可能的模拟数学函数!

命令式语言:计算表达式,将结果存储在存储单元中(程序中的变量),这就是赋值语句的作用

纯函数式程序设计语言:

(1)没有变量,没有赋值语言;

(2)没有变量,也因此没有迭代结果(因为迭代是由变量控制的),重复执行必须用递归

(3)程序:就是函数定义和函数应用的说明

(4)程序的执行:对函数应用的求值

(5)给定相同的参数,执行函数总是生成相同的结果,这一特性称为引用透明

这一特性使得语义比命令式语言更简单,更易测试

(6)提供了一组函数,一组函数组成更复杂的函数

ps. 上述均是针对纯函数式语言,但是目前大多数函数语言都包含一些命令式语言的特性,比如变量和赋值语句;

早期的函数式语言通常是用解释器来执行,但现在大多数都是编译执行。

(三)命令式语言对函数式编程的支持(以python为例)

1、lambda表达式——定义匿名函数

lambda a,b : 2*a+b

2、支持高阶函数

(1)函数作为参数传递

1 >>> deff(x):2 return x*x3

4 >>> add(-5,9,f)5 106

6 >>> deff(x):7 return x*x8

9 >>> defadd(x,y,f):10 print f(x)+f(y)11

12

13 >>> add(2,3,f)14 13

(2)内置的高阶函数map()

map函数有两个参数,一为函数,一为列表,返回值对每一个参数求值

1 >>> map(lambda x:x**3,[1,2,3,4,5])2 [1, 8, 27, 64, 125]3 >>> deff(x):4 return x*x*x5

6 >>> map(f,[1,2,3,4,5])7 [1, 8, 27, 64, 125]8 >>>

(3)内置高阶函数reduce()

map函数有两个参数,一为函数,一为列表,返回值对每一个参数反复调用函数

>>> reduce(prod, [2, 4, 5, 7, 12])3360

>>> deff(x,y):return x+y>>> reduce(f,[1,2,3,4,5])15

View Code

(4)内置高阶函数filter()——判断

>>> deff(x):return x%2==0>>> filter(f,[1,2,3,4,5,6,7,8])

[2, 4, 6, 8]

View Code

(5)..........

3、支持闭包....

(四)函数式编程的优点

1、适用于并行编程——因为不会修改变量,所以过程中不需要同步互斥;

2、惰性求值:这个需要编译器的支持。表达式不在它被绑定到变量之后就立即求值,而是在该值被取用的时候求值;

3、函数确定性:给定同一个参数,肯定是有一个同样的输出

4、代码更简洁

..........

其他:

1、命令式语言是依据冯诺依曼结构的,但是函数式语言并没有

所以说在当前的体系结构上,函数式语言的优势体现的并不明显,还是难以取代命令式语言

2、纯函数式语言现在很少,大多引入了命令式语言的特性

3、函数式语言近来被关注的越来越多,也正是因为命令式语言加入了对其的支持

4、理解函数式语言,最重要的就是理解它的设计尽可能的依照了数学函数的思想

函数式编程语言python-函数式编程语言相关推荐

  1. 编程语言python入门-编程语言入门(以python为例)

    1 前言 该文章以Python语言为例,讲解编程语言的框架.偏重于编程语言的框架,因此主要讲编程语言必须的通用的内容.对于Python语言的特性,不过多讲解,适合入门级选手.想要进一步深入,可以学习P ...

  2. python是什么类型的编程语言-Python在编程语言中是什么地位?

    听说Java开发工资高,想通过专业的培训转行,但是现在学Java的人这么多,会不会人才饱和,然后工资下降.转行之前深思熟虑是好事,但是思考的过程中一些不合理的信息也会对人产生消极影响甚至是误导.今天上 ...

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

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

  4. 函数式编程语言python-Python函数式编程

    在 Python 中使用函数式编程的最佳实践! 简 介 Python 是一种功能丰富的高级编程语言.它有通用的标准库,支持多种编程语言范式,还有许多内部的透明度.如果你愿意,还可以查看 Python ...

  5. python函数式编程模式_函数式编程指引

    概述¶ 本章介绍函数式编程的基本概念.如您仅想学习 Python 语言的特性,可跳过本章直接查看 迭代器. 编程语言支持通过以下几种方式来解构具体问题: 大多数的编程语言都是 过程式 的,所谓程序就是 ...

  6. python函数式编程思想_以python为例,浅谈函数式编程思想

    引 数据集data_socrestudentid course score 1 math 89 2 english 76 . . . 问题:求各studentid总分 方法1-一般写法: studen ...

  7. python partition函数_如何使用正确的姿势进行高效Python函数式编程?

    演讲者:丁来强@Splunk  PyConChina2015 北京站 9月12日与9月19日,PyConChina 2015上海站与北京站顺利落下帷幕."人生苦短,Python 当歌&quo ...

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

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

  9. Python函数式编程指南

    http://www.cnblogs.com/huxi/archive/2011/06/18/2084316.html 1. 函数式编程概述 1.1. 什么是函数式编程? 函数式编程使用一系列的函数解 ...

  10. python函数式编程之functools、itertools、operator详解

    文章目录 写在篇前 itertools 无穷迭代器 最短停止迭代器 排列组合迭代器 operator 基本运算符函数 属性查询 functools partial & partialmetho ...

最新文章

  1. 【并发编程】Future模式及JDK中的实现
  2. linux下的find文件查找命令与grep文件内容查找命令(转)
  3. Cube painting UVA - 253
  4. 欢迎使用Markdown编辑器写博客
  5. 树控件单击获取到的节点信息不是当前选中的节点_常用基本控件测试用例(一)...
  6. private访问权限java_Java之访问权限
  7. linux部署安装nexus私服
  8. 字体rem通用基本设置
  9. 无招胜有招之Java进阶JVM(二)
  10. 【转载】生物软件之DNA分析
  11. mysql 测试数据的脚本_Mysql脚本 生成测试数据
  12. 知乎学了python_为什么要学 Python?
  13. java字符排序_如何按字母顺序对字符串进行排序java
  14. 【easy】349. Intersection of Two Arrays
  15. 2018第七届iWeb峰会城市巡回——杭州站
  16. Django使用 celery发送邮件、Rabbitmq-AMQP
  17. OperationTrident游戏开发总结
  18. page_to_pfn 、virt_to_page、 virt_to_phys、page、页帧pfn、内核虚拟地址、物理内存地址linux内核源码详解
  19. 以Windows系统搭建基于Ethereum(以太坊)的区块链开发环境(具体操作与截图)
  20. win10系统自带清除磁盘垃圾工具———磁盘清理工具

热门文章

  1. tf.placeholder类似函数中的形参
  2. Ruby on rails
  3. hibernate注解之@Onetomany、@Manytoone、@JoinColumn
  4. Visual Studio2017 安装教程(走过的坑绝不再走)
  5. error LNK1104: 无法打开文件“ComService.lib”
  6. oracle中 游标实例
  7. 【转载】:C# string 特殊的引用类型
  8. Microsoft Visual SourceSafe 使用指南
  9. 祝福我的朋友们五一玩的开心!
  10. activeMQ 安装部署文档