python为什么是动态语言图片_为什么俺推荐Python[2]:作为动态语言的Python

上次的帖子介绍了脚本语言的优缺点,然后又拿Python和其它脚本语言PK了一下。今天主要是忽悠一下动态语言,捎带忽悠一下Python。如果你看完本贴,觉得动态语言不错,那俺建议你从Python开始入手。

★动态语言扫盲

考虑到还有很多同学对动态语言了解不深入,有必要先来普及一下它的基本常识。已经了解的同学,请略过本节。

通俗地说:能够在运行时修改自身程序结构的语言,就属于动态语言。那怎样才算是“运行时修改自身程序结构”捏?比如下面这几个例子都 算:在

运行时给某个类增加成员函数及成员变量;在

运行时改变某个类的父类;在

运行时创建出某个函数......

从这些例子,你应该对动态语言有一个初步的感觉了吧?毕竟传统的静态语言(比如C、C++、Java),是很难达到这些效果滴。

另外,有个误区需要澄清一下。很多同学以为脚本语言也就是动态语言。其实两者是

不等价滴——虽然两者有很大的交集。比如C#在4.0之后,就可以算是动态语言了,但它不能算是脚本语言;另外,有很多Shell脚本语言(比如DOS & Windows下的bat),不能算是动态语言。

关于动态语言更深入的介绍,大伙儿可以看“

这里”。

★为啥要学习动态语言?

扫盲之后,就该来说一下,学习动态语言的动机了。搞明白动机,学起来才有干劲嘛

:-)

◇顺应大趋势

假如你经常关注

TIOBE的排名,那你应该能察觉出来,动态语言近两年的发展势头比较迅猛(在Top10里面,至少占了半壁江山)。这能从某个侧面反映出动态语言的影响力在扩大。

假使你不相信

TIOBE的排名,俺再举一个例子。两大开发阵营(Java和dotNet)最近几年也加大了对动态语言的支持力度。比如,dotNet的CLR加入了对

IronPython和

IronRuby的支持;Sun当然也不甘示弱,JVM也开始支持

Groovy,

JRuby等语言。

俺费了这许多口水,列位看官应该明白动态语言是大势所趋吧。在这动态语言大行其道的日子里,你如果连一门动态语言都没搞懂,那出门都不好意思跟人打招呼。

不过,话又说回来,静态语言也是不会消亡滴。毕竟,静态语言有自己的优势(比如严谨、性能)。长期来说,必定是动态语言和静态语言并存。各自弥补对方的缺点。

◇了解新思维、新理念

学习一门动态语言还有一个好处:。有很多时候,多学习一门语言,并不一定是为了在工作中用它,而是为了学习新的思维方式、体会新的理念。比如俺就曾经花时间去看

Prolog,但是俺在工作中,从来不需要用到它。(以后有空的话,俺会介绍一下这玩意儿)

由于动态语言可以在运行时修改自身结构,因此就会产生很多静态语言所没有编程范式和手法(比如

eval、

Mixin,后面会顺带介绍这两个玩意儿)。如果你以前只使用静态语言,那你在学习了动态语言之后,多半会从它身上领略到很多新的思想和理念。

◇能够化繁为简

可能有些同学觉得,前面说的都有些务虚,那咱再来说点具体实在的。大牛

Edsger Dijkstra(图灵奖得主)曾经说过:“编程的艺术就是处理复杂性的艺术。”咱们来看看,动态语言是如何处理复杂问题滴。

假设要你实现一个函数,用来完成两个数的

某种运算,具体的运算类型作为函数的参数传入,然后该函数返回运算结果。比如:

Foo("+", 2, 4) 返回 6

Foo("*", 2, 2) 返回 4

对于上述需求,你会如何实现捏?

请先暗自盘算1分钟,然后再往下看。

......

Thinking

......

如果你用静态语言(比如C、C++、Java)来实现,你可能会在函数内使用一个switch,根据不同的运算符,进行计算,然后返回计算结果。

对于某些比较OO的语言(例如C++、Java),你或许还会抽象出一个运算的接口类(纯虚类),然后分别派生出若干个不同的计算类(比如加法类、乘法类),看起来似乎比switch要优雅一些。

当然,用静态语言还有其它一些玩法,但是代码量都不会少。具体详情可以看很早以前的一个老故事:

4个程序员的一天。(其实俺这个例子的灵感就是从那个老故事剽窃滴)

现在,咱们来看看Python是如何实现该需求滴。用Python只需要两行代码即可。请看:

def Foo(op, n1, n2) :

return eval( "%d %s %d" % (n1, op, n2) )

不懂Python的同学可能要问了,这两行代码是啥子意思呀?

其实,第一行代码只不过是定义了一个函数头,第2行代码才是精华。这里面利用了动态语言常见的

eval手法(具体参见“

这里”)。在python里面,内置的

eval函数可以把某个字符串当成一个表达式,并对其求值。而语句

"%d %s %d" % (n1, op, n2) 只不过格式化出一个表达式的字符串。

顺便再插一句,Python还有一个

exec的内置函数,可以把一段Python源代码作为字符串参数传递给它,让该函数去执行。两个函数结合起来,就能玩出很多花样。具体的花样可以参见“

这里”

★为什么是Python?

说了动态语言的种种好话,有同学会问了,动态语言有很多种,为啥非要学习Python捏?

首先,俺在

本系列的

上一个帖子,已经对比过Python和另外几种脚本语言。那几种脚本语言正好也是知名的动态语言。Python相对于他们的优势,此处就不再重复啰嗦了。

其次,单就语法本身而言,Python的语法对动态性的支持是很优雅、很简洁滴。通过刚才那个

eval小例子,大伙应该已经看出来了。为了更形象一点,咱拿前面提到的

Mixin来Show一下Python的语法是如何的简洁。

通俗地说,

Mixin手法需要在

运行时给某个类增加基类(也就是父类)。对于Python而言,每一个类都有一个内置属性“__bases__”,里面包含这个类

当前的所有基类。假如要在

运行时增加基类,操作“__bases__”这个属性即可。

比如有一个类A和类B。如果要在运行时把B加为A的父类,可以用如下语句:

A.__bases__ += (B, )

是不是也很简洁,而且可读性也不差?相比而言,有些动态语言(比如JavaScript),要实现类似的效果,代码就相对复杂了。

由于Mixin不是今天的重点,就不再深入展开了。

最后,来个总结发言:如果你之前没有接触过动态语言,建议去学习一下;如果你已经打定主意要学,Python是比较好的候选者。

好了,今天就聊到这里。

下一个帖子,咱们来讲讲Python作为一个纯粹的面向对象语言,有些啥特色。

回到本系列的目录

版权声明

本博客所有的原创文章,作者皆保留版权。转载必须包含本声明,保持本文完整,并以超链接形式注明作者编程随想和本文原始地址:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值