2009年8月10日

为什么俺推荐 Python[1]:作为脚本语言的 Python

  俺窃以为,Python 的所有特征中,作为脚本语言(“脚本语言”的定义参见“这里”)是它的首要特征。因此,在本系列帖子中,俺首先来忽悠一下 Python 作为脚本语言,有些啥好处?


★脚本语言好在哪?


  要聊 Python 作为脚本语言的好处,首先得说说脚本语言自身有哪些优点。一般来说,当我们提及“脚本语言”,都是强调其解释执行的特性(虽然有些脚本语言也支持编译)。所以,后面陈述的这些优点,大都是拿编译型语言来进行对比。

◇更高层次的抽象和封装


  大部分脚本语言都提供了(内置了)比较高层次的抽象和封装。像很多脚本语言都内置了字符串处理能力以及正则表达式(典型代表就是 Perl)。还有很多脚本语言都内置了高级的数据结构。比如 Python 在语言层面支持了链表(Python 的术语叫 List)、映射(Python 的术语叫 Dict)、元组(Python 的术语叫 Tuple)。
  有了这些高层次的封装,你写起代码来,就特别滴简单、特别滴爽。比如,在 Python 中要把一个 List 翻倍,只需这么写:
[1,2,3] * 2
就得到
[1,2,3,1,2,3]

◇更少的代码量


  得益于高层次的封装,在完成相同功能的前提下,脚本语言的代码量会比编译型语言少很多。
  比如说,要打印出某个文本文件的内容,如果用 Java 实现,正常的写法大概要七、八行代码(把所有代码硬挤到一行的,不予讨论);用 Python 也就三、五行。
  再比如说,抓取某个网址对应的 web 网页,用 Python 自带的标准库实现,大概3到5行代码;但如果用 C++ 实现,代码量会增加许多(具体要写多少代码,取决于你用了哪个 http 的库)。
  代码量少了之后,至少你看代码的时候(无论是看自个儿滴还是看别人滴),能少敲很多次翻页键,大大延长了键盘的寿命,顺便降低了手指头的劳损。

◇更好的可读性


  当然啦,延长键盘寿命还不是关键,关键在于——代码量少了之后,(通常情况下)会有助于提高可读性。而可读性恰恰是 Python 的强项之一。
  比方说:Python 在【语法层面】强制约定了作用域缩进(这是俺很喜欢 Python 的地方之一)。如此一来,即便是新手程序猿写出的 Python 代码,缩进风格也很统一。反观 C/C++/Java 的新手,写出的代码就没有这么整齐了。

◇更平缓的学习曲线


  通常,脚本语言的语法都比较简单、傻瓜化。因此,入门也就容易很多。稍微有一些编程基础的人,就能够在短时间内上手。
  比如俺手下的 C++、Java 程序员,以及某些测试人员,都可以在一周内(程序员用不着一周,一般就1、2天)掌握 Python 的语法并用来写一些辅助的小工具。大大节约了俺培训的口水。

◇支持“交互式”


  很多脚本语言的 IDE 支持【交互式写代码】。也就是说,你每写完一行代码,解释器就执行一把。这样能很快发现输入错误,而且还可以立即看到执行结果。


★脚本语言有啥缺点?


  前面说了那么多优点,那脚本语言有啥缺点捏?
  主要的缺点就是【性能差】。这是他们为上述优点所付出的沉重代价。所幸当今的计算机硬件突飞猛进,性能差的缺点已经越来越不明显了。


★Python 和其它脚本语言的比较


  有同学可能要问了,脚本语言有很多,为啥俺独独青睐 Python 捏?
  为了回答这个问题,下面俺拿 Python 和一些常见的脚本语言作一些【肤浅的】比较。
  鉴于后面的内容极易引发语言的口水战,俺特此声明:虽然接下来会提及某些语言相对于 python 的缺点,但俺绝无贬低这些语言的企图,也无意证明 python 比这些语言优秀!俺只是陈述一下:当年是如何在几种脚本语言中进行取舍的?
  除了 Python 之外,常见的脚本语言还有很多,比如:PHP、JavaScript(以下简称 JS)、Perl、VBScript(以下简称 VBS)、Ruby、Bash、Lua、Tcl(可别误以为是某家电厂商)......Python 是如何从这些脚本语言中脱颖而出的捏?俺挑选的时候,主要考虑了如下几点:

◇通用性(跨领域)


  因为俺懒得学太多编程语言。所以,俺希望熟悉一门脚本语言之后,能够尽量多帮俺搞定不同领域的事儿。从这点来看,俺就不会选择 PHP(太偏重于 Web 服务端)、JS(太偏重于 Web 客户端)、诸如 Bash 之类的 Shell 脚本(太偏重于系统管理)。
  而 Python 则属于通用的脚本语言,覆盖范围很广。比如 Web 开发、桌面 GUI 应用、系统管理、网络应用、科学计算等许多领域,Python 都可以轻易搞定。

◇人气够旺


  关于“人气”的重要性,俺在《如何选择开源项目》一文中,有介绍过。人气越高、越流行,就意味着更多的资源(包括文档、相关软件),当你碰到问题需要解决,也有更多的人可以咨询。
  关于编程语言的流行程度,可以大致参考 TIOBE 的排名(虽然 TIOBE 不能全面反映流行程度,但至少可作为某种参考)。
  像 Tcl、PowerShell、Groovy、JavaFX 等都排在30名之外(截至写本文的2009年8月),感觉用的人太少了,俺暂时不予考虑。而 Python 最近几年的排名则一路上升(请看“这里”),截止到2009年8月,已经高踞排行榜第6位。Perl 虽然也身居高位,但是最近几年的排名一路下滑(请看“这里”)。俺个人认为,其人气不容乐观。

◇功能够强、库够丰富


  另一个俺很看重的地方是功能是否够强大。在这点上,Python 和 Perl 都算是比较强悍的。关于 Python 如何强悍,俺会在本系列的第5篇帖子《作为瑞士军刀的 Python》中加以介绍。
  反观 JS、Ruby、Tcl 等语言,则稍显不足(当然,也有可能俺孤陋寡闻)。

◇跨平台


  由于俺平时会使用不同的操作系统,再加上俺负责的产品也是跨平台的。所以,俺对脚本语言有跨平台的要求。说到跨平台,诸如VBS、Bash之流就不予考虑了。
  其实,很多脚本语言都支持跨平台。而 Python 在这方面,更为出众。不光支持主流的操作系统,还支持一些冷门的(比如古老的 DOS),还支持手持设备(比如智能手机和平板)。

◇和其它语言的整合、交互


  最后这一点,估计大多数同学不会太关心。俺因为要在公司的产品中引入脚本技术,所以俺还得考虑该脚本语言和其它语言的整合能力。整合能力强的脚本语言,可以作为复杂系统中的胶水,用来把不同模块粘合在一起(关于 Glue Language,可以参见“这里”)。
  在这方面,Python 和 Ruby 的表现都不错:
它们和 Java 的整合有JythonJRuby
和 dotNet 平台的整合有IronPythonIronRuby
至于俺常用的 C++,Python 整合得比 Ruby 好。比如 C++ 社区大名鼎鼎的 Boost 库里面,就内置了一个 Boost.Python 的子库(参见“这里”)。
  关于 Python 如何用作胶水,俺会在后续的帖子“作为胶合语言的 Python”中会详细介绍。


★总结


  基于上述几个方面的考虑,俺最终选择了 Python 作为日常使用的脚本工具,并把它引入到公司的产品中,作为模块之间的胶合剂。
  啰嗦完Python作为脚本语言的方方面面,下一个帖子,咱来聊一下它作为动态语言的那些事儿。


回到本系列的目录

18 条评论:

  1. 恩,请问一下你的手机是什么牌子型号呢?
    我也想看看我的手机能不能Python运行环境,MOTO Q8,系统windows mobile 6

    回复删除
  2. 楼上的同学:
    可以试试看 PythonCE
    http://sourceforge.net/projects/pythonce/

    回复删除
  3. 楼主的博客,没有搜索框哦,搜索不太方便^^

    回复删除
  4. 应楼上同学的建议,增加了一个搜索框 :)

    回复删除
  5. “代码量少了之后,至少你看代码的时候(无论是看自己的还是看别人的),能少敲很多次的翻页键,大大延长了键盘的寿命,顺便降低了手指头的劳损。”应该改成“代码量少了之后,至少你看代码的时候(无论是看自己的还是看别人的),能少敲很多次的翻页键,大大提高了可读性。”,后面半开玩笑的方式很多人未必能理解。

    回复删除
  6. to xiecheng
    俺希望博客的读者都能够多一些幽默感,所以时常会在博文中夹杂些开玩笑的说法。

    所谓的
    “大大延长了键盘的寿命,顺便降低了手指头的劳损”
    这个很浅显,大部分程序员应该不会真的以为俺在心疼键盘吧?

    回复删除
  7. 当然知道不是心疼键盘,而且幽默也很好。只是觉得提高可读性这个很重要,值得提一下,至少之前幽默的表达方式中看不出来这点。

    回复删除
  8. to xiecheng
    俺想了一下,决定听从你的建议 :)
    原文中增加了一节,强调了Python语言在“可读性”方面的优点。

    回复删除
  9. hello program-think!请问你学python时候用的什么书呢?你现在觉得初学python用哪本书好呢?我的水平是:大学一年级学校讲了C语言,学得还可以,大学二年级学了matlab。感谢指导!

    回复删除
  10. TO Fang Gao
    俺当年学 Python 的时候比较早,也没有认真找些经典的入门书。
    当时随便找了本没名气的书,稍微知道点语法,就开始上手写代码了。

    如今有几本比较有名的书,都有电子版,你参考一下:
    《Learning Python》
    《A Byte of Python》
    《Dive into Python》

    如果你已经掌握 C 语言,再学 Python 应该不难。

    回复删除
  11. TO program-think
    Thank you so much for your help! ^_^

    回复删除
  12. 我是毫无经验的新手但现在对编程有兴趣,请问博主我应该先从什么开始学起,或者说具体从哪种语言开始学起,各种语言有共通点的吗,还有这样直接学python可以学的来吗?问题有点多,但希望博主能回答下我,非常感谢。

    回复删除
    回复
    1. 听说python是最适合新手学的语言,还听说有一个特别好的教程:[url=https://learn-python-the-hard-way-zh_cn-translation.readthedocs.org/en/1.0/index.html]笨办法学Python[/url]

      删除
    2. TO 12楼的网友
      Python 的语法比较简单,上手比较容易。
      尤其适合没有编程经验和技术背景的人。
      如果你愿意花点时间,入门 Python 应该不难。

      编程语言的共同点主要体现在“编程范式”上——相同范式的语言,共通之处较多。
      有些编程语言只有一种范式,有的有多种范式(比如Python)

      删除
  13. 想用Python了
    原来用 ruby 的,感觉ruby高大上

    回复删除
  14. “了字符串处理能力以及正则表达式(典型代表就是Perl)。还有很多脚本语言都内置了高级的数据结构。比如Python在语言层面支持了链表(Python的术语叫List)”

    博主,python的list,貌似不是链表。。。
    list似乎更像是c语言的连续储存的数组。。。

    望博主证实后修改啊!

    回复删除
  15. 希望lz补充讲讲什么是脚本语言!

    回复删除
  16. 对于完全不懂编程的我,为了看番速度快点,然后去找了篇教程,就发现我压根看不懂。什么找延迟节点,追加hosts···字倒是认识,就是操作······不会
    我还是放弃吧········白follow了您这么久,还是对编程一无所知,被打击到了,哎~

    回复删除