Then God said: "Let there be light"; and there was light. And God saw that the light was good; and God separated the light from the darkness.

唠叨一些关于Python的事情

如同学习任何一种自然语言比如英语、或者其它编程语言比如汇编(这个我喜欢,可惜多年之后,已经好久没有用过了)一样,总要说一说有关这种语言的事情,有的可能就是八卦,越八卦的越容易传播。当然,以下的所有说法中,难免充满了自恋,因为你看不到说Python的坏话。这也好理解,如果要挑缺点是比较容易的事情,但是找优点,不管是对人还是对其它事务,都是困难的。这也许是人的劣根之所在吧,喜欢挑别人的刺儿,从而彰显自己在那方面高于对方。特别是在我们这个麻将文化充斥的神奇地方,更多了。

废话少说点(已经不少了),进入有关python的话题。

Python的昨天今天和明天

这个题目有点大了,似乎回顾过去、考察现在、张望未来,都是那些掌握方向的大人物(司机吗?)做的。那就让我们每个人都成为大人物吧。因为如果不回顾一下历史,似乎无法满足学习者的好奇心;如果不考察一下现在,学习者不放心(担心学了之后没有什么用途);如果不张望一下未来,怎么能吸引(也算是一种忽悠吧)学习者或者未来的开发者呢?

Python的历史

Python的创始人为吉多·范罗苏姆(Guido van Rossum)。关于这个人开发这种语言的过程,很多资料里面都要记录下面的故事:

1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言的一种继承。之所以选中Python作为程序的名字,是因为他是一个蒙提·派森的飞行马戏团的爱好者。ABC是由吉多参加设计的一种教学语言。就吉多本人看来,ABC这种语言非常优美和强大,是专门为非专业程序员设计的。但是ABC语言并没有成功,究其原因,吉多认为是非开放造成的。吉多决心在Python中避免这一错误,并取得了非常好的效果,完美结合了C和其他一些语言。

这个故事我是从维基百科里面直接复制过来的,很多讲python历史的资料里面,也都转载这段。但是,在我来看,这段故事有点忽悠人的味道。其实,上面这段中提到的,吉多为了打发时间而决定开发python的说法,来自他自己的这样一段自述:

Over six years ago, in December 1989, I was looking for a "hobby" programming project that would keep me occupied during the week around Christmas. My office (a government-run research lab in Amsterdam) would be closed, but I had a home computer, and not much else on my hands. I decided to write an interpreter for the new scripting language I had been thinking about lately: a descendant of ABC that would appeal to Unix/C hackers. I chose Python as a working title for the project, being in a slightly irreverent mood (and a big fan of Monty Python's Flying Circus).(原文地址:https://www.python.org/doc/essays/foreword/)

首先,必须承认,这个哥们儿是一个牛人,非常牛的人。此处献上我的崇拜。

其次,做为刚刚开始学习python的朋友,可千万别认为python就是一个随随便便就做出来的东西,就是一个牛人一冲动搞出来的东西。人家也是站在巨人的肩膀上的。

第三,牛人在成功之后,往往把奋斗的过程描绘的比较简单,或者是谦虚?或者是让人听起来他更牛?反正,我们看最后结果的时候,很难感受过程中的酸甜苦辣。

不管怎么样,牛人在那时刻开始创立了python,而且,他更牛的在于具有现代化的思维:开放。通过Python社区,吸引来自世界各地的开发者,参与python的建设。在这里,请读者一定要联想到Linux和它的创始人芬兰人林纳斯·托瓦兹。两者都秉承“开放”思想,得到了来自世界各地开发者和应用者的欢呼和尊敬。也请大家再联想到另外一个在另外领域秉承开放思想的人——邓小平先生,他让一个封闭的破旧老水车有了更新。

请列位多所有倡导“开放”的牛人们表示敬意,是他们让这个世界更美好了。他们以行动诠释了热力学第二定律——“熵增原理”。

Python的现在

有一次与某软件公司一个号称是CTO的人谈话,他问我用什么语言开发,我说用Python,估计是我的英语发音不好吧(我这回真的谦虚了一把),他居然听成了Pascal(也是一种高级语言,现在很少用了,曾经是比较流行的教学语言)。呜呼,Python是小众吗?不是,是那家伙眼界不开阔!接触过不少号称CTO的,多数是有几年经验的程序员,并没有以国际视野来看待技术,当然,大牛的CTO还是不少的。总之,不要被外表忽悠了,“不看广告,看疗效”。

首先看一张最近一期的编程语言排行

python在这个榜单中第8,也许看官心理在想:为什么我不去学那个排第一呢?如果您是一个零基础的学习者,我以多年的工作和教学经验正告:还是从入门比较容易的开始吧,python是这样的。等以后,完全可以拓展到其它语言。或许你又问了,php和vb是不是可以呢?他们排名比python靠前。回答是:当然可以。但是,学习一种入门的语言,要多方考虑,或许以后你就不想学别的,想用这个包打天下了,那就只有python。并且,还得看下面的信息:

根据Dice.com一项网上对20000名IT专业人士进行调查的结果 : java类平均工资:91060美元; python类平均工资:90208美元;

不错,python程序员平均来讲,比java平均工资低,但看看差距,再看看两者的入门门槛,就知道,学习python绝对是一个性价比非常高的投资啦。

Python就是这样,默默地拓展着它的领域。

Python的未来

未来,要靠列为来做了,你学好了,用好了,未来它就光明了。它的未来在你手里。

Python的特点

很多高级语言都宣称自己是简单的、入门容易的,并且具有普适性的。真正做到这些的,不忽悠的,只有Python。有朋友做了一件衬衫,上面写着“生命有限,我用Python”,这说明什么?它有着简单、开发速度快,节省时间和精力的特点。因为它是开放的,有很多可爱的开发者(为开放社区做贡献的开发者,是最可爱的人),将常用的功能做好了,放在网上,谁都可以拿过来使用。这就是Python,这就是开放。

抄一段严格的描述,来自维基百科:

Python是完全面向对象的语言。函数、模块、数字、字符串都是对象。并且完全支持继承、重载、派生、多继承,有益于增强源代码的复用性。Python支持重载运算符,因此Python也支持泛型设计。相对于Lisp这种传统的函数式编程语言,Python对函数式设计只提供了有限的支持。有两个标准库(functools, itertools)提供了Haskell和Standard ML中久经考验的函数式程序设计工具。

虽然Python可能被粗略地分类为“脚本语言”(script language),但实际上一些大规模软件开发项目例如Zope、Mnet及BitTorrent,Google也广泛地使用它。Python的支持者较喜欢称它为一种高级动态编程语言,原因是“脚本语言”泛指仅作简单程序设计任务的语言,如shell script、VBScript等只能处理简单任务的编程语言,并不能与Python相提并论。

Python本身被设计为可扩充的。并非所有的特性和功能都集成到语言核心。Python提供了丰富的API和工具,以便程序员能够轻松地使用C、C++、Cython来编写扩充模块。Python编译器本身也可以被集成到其它需要脚本语言的程序内。因此,很多人还把Python作为一种“胶水语言”(glue language)使用。使用Python将其他语言编写的程序进行集成和封装。在Google内部的很多项目,例如Google Engine使用C++编写性能要求极高的部分,然后用Python或Java/Go调用相应的模块。《Python技术手册》的作者马特利(Alex Martelli)说:“这很难讲,不过,2004年,Python已在Google内部使用,Google召募许多Python高手,但在这之前就已决定使用Python。他们的目的是尽量使用Python,在不得已时改用C++;在操控硬件的场合使用C++,在快速开发时候使用Python。”

可能里面有一些术语还不是很理解,没关系,只要明白:Python是一种很牛的语言,应用简单,功能强大,google都在使用。这就足够了,足够让你下决心学习了。

python哲学

Python之所以与众不同,还在于它强调一种哲学理念,用黑字表示强调吧:

Python的设计哲学是“优雅”、“明确”、“简单”。

Python开发者的哲学是“用一种方法,最好是只有一种方法来做一件事。在设计Python语言时,如果面临多种选择,Python开发者一般会拒绝花俏的语法,而选择明确没有或者很少有歧义的语法。由于这种设计观念的差异,Python源代码通常具备更好的可读性,并且能够支撑大规模的软件开发。这些准则被称为Python格言。

The Zen of Python

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!

上面的诗来自Python官方,已经把前面唠叨的东西做了精美的概括。有中译本,看这里,本文摘抄一种中文翻译:

优美胜于丑陋,明晰胜于隐晦
简单胜于复杂,复杂胜于繁芜
扁平胜于嵌套,稀疏胜于密集
可读性很重要。
虽然实用性比纯粹性更重要,
但特例并不足以把规则破坏掉。

错误状态永远不要忽略,
除非你明确地保持沉默,
直面多义,永不臆断。

最佳的途径只有一条,然而他并非显而易见————谁叫你不是荷兰人?

置之不理或许会比慌忙应对要好,
然而现在动手远比束手无策更好。

难以解读的实现不会是个好主意,
容易解读的或许才是。

名字空间就是个顶呱呱好的主意。

让我们想出更多的好主意!

准备

已经描述了python的美好,开始学啦,做好如下准备:

  • 电脑,必须的。不管是什么操作系统。
  • 上网,必须的。没有为什么。

除了这些,还有一条,非常非常重要,写在最后:这是自己的兴趣。