1、基础知识python
(一)编程语言(程序设计语言)的分类?编程
一般可分为4类:命令式语言、函数式语言、逻辑语言和面向对象的语言(实际上还有不少不一样的划分版本)数组
一、命令式编程语言(imperative language)数据结构
计算机体系结构是影响语言设计的一个重要因素,目前的大多数语言都是围绕着冯诺依曼结构设计的,闭包
这些语言称为“命令式语言”。编程语言
命令式语言的核心特征:编辑器
(1)变量(冯诺依曼结构的存储单元)函数式编程
(2)赋值语句(数据传输)函数
(3)迭代形式的循环(冯诺依曼结构中实现循环的最高效形式)工具
二、函数式编程语言(functional language)
命令式编程语言是以冯诺依曼这种体系结构为模型,而函数式程序语言的目的是尽量的模拟数学函数。
函数式语言的核心特征:
(1)以“函数”为首,如同命令式语言中的“变量”,函数能够赋值给其余变量,能够做为其余函数的参数,
或者做为其余函数的返回值。
(2)不修改变量的值
(3)只有表达式,没有语句。此处的语句指的是没有返回值得某些操做。
(4)引用透明(Referential transparency),函数的运行不依赖与外部变量或“状态”,简单的说就是,
同一个输入(参数),老是会产生同一个输出(返回值),这与数学函数的特征很一致。
命令式语言由于全局变量等的存在,就没法作到这一点。
(5)对比命令式语言,递归形式的循环
三、逻辑程序设计语言(logic programming language)(未研究)
逻辑程序设计语言:基于逻辑符号逻辑的语言称为逻辑程序设计语言,或者声明性语言
逻辑程序设计:用一种符号逻辑做为程序设计语言来进行程序设计,一般称为逻辑程序设计
逻辑式编程语言是基于规则的编程语言
程序是事实和规则集,经过符号逻辑表示程序,并使用逻辑推导过程来生成结果。
四、面向对象语言(object oriented language)
听起来最亲切的一个种类..........
严格来讲,面向对象语言不该该处在与命令式语言并列的状态,面向对象语言的设计也是依据冯诺依曼结构,
它是从命令式语言发展而来,我以为它自己就是命令式语言。
“面向对象”:强调的是开发模式,与它相对的开发模式就是“面向过程”
因此说就是“命令式语言”一般指的是“面向过程开发的编程语言”,好比C语言;
“面向对象语言”指的就是“面向对象开发的编程语言”,好比C++和Java。
主要特征:
(1)封装:将数据和方法封装成类
(2)继承:子类继承父类,能够自动共享父类的数据结构和方法
(3)多态:子类能够修改父类的方法
五、其余语言:
(1)脚本语言(Scripting language)(python、JavaScript等等)
脚本语言也是一类语言,只不过度类的依据与上述不一样,脚本语言属于“命令式语言”的范畴
单拎出这个分类是因为其的运行方式——解释执行,没有编译过程
(2)可视化语言
一样是命令式语言的一个子类,可以以拖放的方式生成代码段(好比.NET)
(3)标记语言(markup language)(HTML、XML等)
这种语言,不算作编程语言;
可是某些标记语言(好比HTML和XML)的扩展中,也加入了一些程序设计的功能
——标记与程序设计混合语言(好比JSP标准标签库中的JSTL)
(4)还有一些特殊用途的语言等等
(二)语言执行方式?
一、编译执行——针对编译语言
简单理解,编译执行就是先将源语言(一般是高级语言)翻译成目标语言机器语言(01码),以后再执行。
源语言——>目标语言的翻译过程,包括词法分析、语法分析、语义分析多个步骤
什么是翻译,用会话语言想一下就懂了,翻译就是从一种语言换成另外一种语言的过程(中文—>英文)
(我之因此在这写这么多,是由于这个简单的道理我是通过好久才悟的....)
二、彻底解释执行——针对动态语言(脚本语言)
对比编译执行,就是没有翻译的过程,程序由另外一个称为解释器的程序(虚拟机)解释执行。
三、混合执行——编译与彻底解释的折中
源语言——(翻译)——> 中间语言——(解释执行)——>结果
引入中间语言的目的是什么呢?就是这种语言更便于解释执行
好比Java:
(1)首先,将源代码翻译成中间语言(中间形式)——字节码
(2)Java虚拟机(字节码解释器)对字节码进行解释执行
由此也能够理解,编译有两种可能性:
(1)对于编译语言来讲:编译是将源代码编译成可以做用于真机的指令,生成的语言是直接做用于硬件的
(2)对于动态语言来讲:编译是将源代码编译成一个中间形式,好比字节码
字节码不是做用于硬件,而是虚拟机
字节码是什么?——就是一系列的字节,每一个字节表示一个指令
(三)开发环境
开发环境不难理解,是软件开发中使用的工具集
这个工具集能够只包含一个文件系统、一个文本编辑器、一个连接器和一个编译器,
也能够包含不少集成的工具,每一个工具均可以经过统一的用户界面来使用。
2、函数式编程
因此什么是函数式编程呢..........................,首先再复习一下基础知识.....................................
(一)数学函数
数学函数是从一个集合到另外一个集合的映射,前者称为定义域,或者称为值域。
映射过程的描述:表达式或者表
特征:
(1)映射表达式的求值顺序由递归表达式和条件表达式控制
(2)给定同一个参数,老是输出值域几个中的同一个元素
一、简单函数——函数名后跟括号内的一组参数,以后是表达式,例如:
f(x)=x*x*x,其中x是实数
此函数:
(1)定义域和值域都是实数
(2)若是执行求f(2),即参数是2,在整个求值过程当中,x的值恒为2,不改变
二、λ标记法——提供了一种定义匿名函数的方法。
λ表达式:是一个匿名函数,说明了函数的参数和映射,然而此函数没有名字,
λ表达式和其余函数定义同样,能够有一个以上的参数——λ(x)x*x*x
λ计算:一个使用λ表达式的计算模型
λ计算是函数式编程语言的灵感所在
三、高阶函数——以一个或多个函数做为参数,两种类型
(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为例)
一、lambda表达式——定义匿名函数
lambda a,b : 2*a+b
二、支持高阶函数
(1)函数做为参数传递
1 >>> def f(x): 2 return x*x 3 4 >>> add(-5,9,f) 5 106 6 >>> def f(x): 7 return x*x 8 9 >>> def add(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 >>> def f(x): 4 return x*x*x 5 6 >>> map(f,[1,2,3,4,5]) 7 [1, 8, 27, 64, 125] 8 >>>
(3)内置高阶函数reduce()
map函数有两个参数,一为函数,一为列表,返回值对每个参数反复调用函数
(4)内置高阶函数filter()——判断
(5)..........
三、支持闭包....
(四)函数式编程的优势
一、适用于并行编程——由于不会修改变量,因此过程当中不须要同步互斥;
二、惰性求值:这个须要编译器的支持。表达式不在它被绑定到变量以后就当即求值,而是在该值被取用的时候求值;
三、函数肯定性:给定同一个参数,确定是有一个一样的输出
四、代码更简洁
..........
其余:
一、命令式语言是依据冯诺依曼结构的,可是函数式语言并无
因此说在当前的体系结构上,函数式语言的优点体现的并不明显,仍是难以取代命令式语言
二、纯函数式语言如今不多,大多引入了命令式语言的特性
三、函数式语言近来被关注的愈来愈多,也正是由于命令式语言加入了对其的支持
四、理解函数式语言,最重要的就是理解它的设计尽量的依照了数学函数的思想