Python和lisp在函数式编程上有哪些异同

Python014

Python和lisp在函数式编程上有哪些异同,第1张

Python内在的函数式功能

自Python 1.0起,Python就已具有了以上所列中的绝大多数特点。但是就象Python所具有的大多数特性一样,这些特点出现在了一种混合了各种特性的语言 中。 和Python的OOP(面向对象编程) 特性非常象,你想用多少就用多少,剩下的都可以不管(直到你随后需要用到它们为止)。在Python 2.0中,加入了列表解析(list comprehensions)这个非常好用的”语法糖“。 尽管列表解析没有添加什么新功能,但它让很多旧功能看起来好了不少。

Python中函数式编程的基本要素包括functionsmap()、reduce()、filter()和lambda算子(operator)。 在Python 1.x中,apply()函数也可以非常方便地拿来将一个函数的列表返回值直接用于另外一个函数。Python 2.0为此提供了一个改进后的语法。可能有点让人惊奇,使用如此之少的函数(以及基本的算子)几乎就足以写出任何Python程序了;更加特别的是,几乎 用不着什么执行流程控制语句。

所有(if,elif,else,assert,try,except,finally,for,break,continue,while,def)这 些都都能通过仅仅使用函数式编程中的函数和算子就能以函数式编程的风格处理好。尽管真正地在程序中完全排除使用所有流程控制命令可能只在想参 加”Python混乱编程“大赛(可将Python代码写得跟Lisp代码非常象)时才有意义,但这对理解函数式编程如何通过函数和递归表达流程控制很有 价值。

剔除流程控制语句

剔除练习首先要考虑的第一件事是,实际上,Python会对布尔表达式求值进行“短路”处理。这就为我们提供了一个if/elif/else分支语句的表达式版(假设每个分支只调用一个函数,不是这种情况时也很容易组织成重新安排成这种情况)。 这里给出怎么做:

对Python中的条件调用进行短路处理

Python

# Normal statement-based flow control

if <cond1>:   func1()

elif <cond2>: func2()

else:         func3()

# Equivalent "short circuit" expression

(<cond1>and func1()) or (<cond2>and func2()) or (func3())

# Example "short circuit" expression

>>>x = 3

>>>def pr(s): return s

>>>(x==1 and pr('one')) or (x==2 and pr('two')) or (pr('other'))

'other'

>>>x = 2

>>>(x==1 and pr('one')) or (x==2 and pr('two')) or (pr('other'))

'two'

我们的表达式版本的条件调用看上去可能不算什么,更象是个小把戏;然而,如果我们注意到lambda算子必须返回一个表达式,这就更值得关注了。既然如我 们所示,表达式能够通过短路包含一个条件判断,那么,lambda表达式就是个完全通用的表达条件判断返回值的手段了。我们来一个例子:

Python中短路的Lambda

Python

>>>pr = lambda s:s

>>>namenum = lambda x: (x==1 and pr("one")) \

....                  or (x==2 and pr("two")) \

....                  or (pr("other"))

>>>namenum(1)

'one'

>>>namenum(2)

'two'

>>>namenum(3)

'other'

将函数作为具有首要地位的对象

前面的例子已经表明了Python中函数具有首要地位,但有点委婉。当我们用lambda操作创建一个函数对象时, 我们所得到的东西是完全通用的。就其本质而言,我们可以将我们的对象同名字”pr”和”namenum”绑定到一起, 以完全相同的方式,我们也也完全可以将数字23或者字符串”spam” 同这些名字绑定到一起。但是,就象我们可以无需将其绑定到任何名字之上就能直接使用数字23(也就是说,它可以用作函数的参数)一样,我们也可以直接使用 我们使用lambda创建的函数对象,而无需将其绑定到任何名字之上。在Python中,函数就是另外一种我们能够就像某种处理的值。

我们对具有首要地位的对象做的比较多的事情就是,将它们作为参数传递给函数式编程固有的函数map()、reduce()和filter()。这三个函数接受的第一个参数都是一个函数对象。

map()针对指定给它的一个或多个列表中每一项对应的内容,执行一次作为参数传递给它的那个函数 ,最后返回一个结果列表。

reduce()针对每个后继项以及最后结果的累积结果,执行一次作为参数传递给它的那个函数;例如,reduce(lambda n,m:n*m, range(1,10))是求”10的阶乘”的意思(换言之,将每一项和前面所得的乘积进行相乘)

filter()使用那个作为参数传递给它的函数,对一个列表中的所有项进行”求值“,返回一个由所有能够通过那个函数测试的项组成的经过遴选后的列表。

我们经常也会把函数对象传递给我们自己定义的函数,不过一般情况下这些自定义的函数就是前文提及的内建函数的某种形式的组合。

通过组合使用这三种函数式编程内建的函数, 能够实现范围惊人的“执行流程”操作(全都不用语句,仅仅使用表达式实现)。

Python是Python,Lisp是Lisp,好比你跟一个不懂英语的人讲英语,对方必然不知道你说的是什么。Python编译器无法解释Lisp的。

Lisp用的人。。。真的可以归为珍稀物种,一般不用CAD的人很少听说用Lisp的,除了科学院的大牛们某些工作指定用Lisp。

命令严谨不严谨,我就举个例子吧。比如if这个函数,本身是系统自带的函数,跟其他大部分语言的if是相同的,如(if (=a 1)(......))相当于if(a == 1){........}。但是,if是可以被重新定义的,比如(setq if 1),此后的if都等同于1,比如(+ 1 if),则等于2。

学嘛,肯定好学,因为所有代码就一个格式:(函数 变量1 变量2 变量3 变量4……)如果括号内第一个元素不是函数,则:'(参数1 参数2 参数3 参数4……),别忽略前面的单引号。

实现功能,所有语言都能实现特定功能,但是最基础的lisp能实现的功能不多,大多是一些运算,如果要外接任何其他语言的接口,必须加载activeObjectX控件,就是常说的VisualLisp。基础的Lisp设计界面肯定是没有的,所有设计界面什么的,基本等同于加强版的记事本,比如notepad++。如果你说的设计界面指的是交互窗口,那就必须用Lisp搭配DCL实现。

你说的汉化是指软件界面吗?CAD自带的lisp编译工具本身就是随着CAD汉化的。如果你说的是类似易语言的汉化,可以自己编写,比如(setq 赋值 'setq),就是把"赋值"两个字赋值为Lisp语言的setq赋值命令。以后就可以用(赋值 A 1),实现A=1的操作。再比如(setq 函数 defun),之后定义函数都可以用(函数 A()(……))来定义函数A。

漏掉错误指的是什么?如果你说的是编译器的话,可以放心,除非是语法没错但思路错了的BUG。

可视化,可以即时编译即时加载,只要你的所有代码段都是完整的可以加载成功,马上测试,同其他语言。

这几种都是程序设计语言。其中Python类似于Javascript,可以写出很短小但是功能强大的小程序;

Perl 是一种自由且功能强大的编程语言。它被用作 Web 编程、数据库处理、XML 处理以及系统管理等等

C语言是一种功能非常强大的高级语言,是目前最常用的程序设计语言之一.

LISP是一种比较简单的动态语言,在美国常用于初学者学习,目前国内关于LISP的资料不是很多,尤其是书籍方面,所以建议初学C,不过学C有一定难度,可以参考谭浩强的<<C语言程序设计>>...