整理一篇网上神文《完全用Python工作---Harness the power of Python》,借以增强自己对Python的信心!
Python彩蛋:在python解释器里输入import antigravity

Python是荷兰人Guido van Rossum1991年开发完成的脚本解释语言。起这个脑缺的名字是因为他是一个叫做Monty Python的脑缺喜剧团体的脑残粉(BTW,Monty Python出演的巨蟒与圣杯是英国电影史上跟大话西游同样地位的喜剧,其中亚瑟王被黑成了炭,里面圆桌骑士们拿着块石头敲来敲去各处蹦达着,看影评我才知道这是表示他们在骑马……于是人们知道以这么脑残的名字取的语言,如果不是像brainfuck语言一样的brainfucker,那么就会像莫里盖尔曼以乔伊斯“芬尼根的守夜人”中虚构名词来命名的夸克一样,成为一个一个不朽的新创造。Python显然属于后者。
The Zen of Python
在python命令行里输入import this可以看到:
------------------------------------------------------------------------------
The Zen of Python, by Tim Peters
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!
------------------------------------------------------------------------------
Why Python?
编程语言的两极是Assembly和Haskell, 一个接近硬件的本质, 一个接近计算的本质. 一个是地狱, 处理着最繁琐最耗神的事情:内存分配, 系统调度, 硬件架构, 各种寄存器A1, B2... 一个是天堂, 优美的写着递归, 高阶函数, lambda表达式, 优美的并行计算(完全不用考虑race condition). 然而我们生活在人间, 所以大规模应用的语言不可能如此纯粹. 两端中间游离着很多general-purpose的语言, C, C++, Java, Ruby, 几乎都能达到我们所有日常的要求. 只不过,这些语言能做的Python都能做,而且Python做得更好。接下来我说明为什么。但是要说明本文的读者不包括写嵌入式,写 javascript以及写大型项目对性能要求极高的人(即使是大型项目也可以80%用python,20%用C),当然还有就是java和C++的重度 患者。(完全使用XX工作意思不是"所有人都完全使用XX工作”!显然只是部分人。更多的是,非专业编程但是想提高效率的人。
首先,我想说的是,为什么不用下面这些大部分人很熟悉的语言(我不是很喜欢这段,太损了):
1. C: 你难道指针扎得不疼么? 每天收垃圾很舒服? 键盘上P右边两个键是不是已经按坏了?
2. C++: 学C++三年以内请不要说你会C++; 学了三年以上的人, 恭喜你们, 你过去几年浪费的时间我可以拿着香飘飘环绕地球一圈了.
3. Java: 不好意思, 看到Spring我就头疼, 而且Java7才引进Lambda表达式实在是太晚了, 即使java以后会跟python越来越像, 至于支持真正的函数式编程? 我希望下个末日之前可以实现. 而且有时候我确实需要单行执行的解释器而Java并没有。
4. Ruby: 你为什么不直接说你只是为了用RoR?
5. Lisp: 如果你用lisp, 你平时肯定会用python或者perl写脚本。 而且你会Lisp不去拯救世界还来看这篇文章干什么?!
6. Perl: 我第一次看Perl的代码就感觉像用脚写的. "为什么满屏的正则表达式?"!
7. C#, php, javascript: 呵呵。
8. Shell: 这算语言么?
9. Matlab: 第一,我穷酸学生没钱每年买你的正版, 看到激活码就想吐。 第二,我不想心血来潮画两个心形函数的时候用1mb的窄带花两天下个5.03Gb的文件在我128Gb的固态硬盘里装,然后用完两个小时就删,如此循环。 第三,我会python了不想再花时间学你的sb语法,熟悉你的.m文件。第四,所有对windows的垄断的血泪控诉都直接对mathwork转过来 吧~什么对开源,对自由,对的打击信仰~绝对适用~ 第五,python大部分时候如果不比你好用至少跟你一样好用,而这只是它不到10%的功能,几个程序员业余时间写出来的库。真心请matlab你这个没 事发邮件“培训一个星期2000刀打折700刀”的大公司滚粗。
Python确实很慢……
恐怕Python最大的缺点就是运行速度慢,而且很严重,相同的程序Python比C慢十几倍很正常。这让Python的发展受到很多限制。在我的research实验中,最早用的是C++写的程序,后来改到Python,那个慢的我想死,后来发现了pypy了,才有所改观。但是除了数值计算以外,Python在大多数应用上,运行速度的劣势被他开发周期短的优势大大地弥补了,反正程序写完了,就放在哪里跑,我就可以去吃饭、看电影、玩游戏了……
Python的运行速度并非是他的诟病,Python慢的很有个性,有信心,否则Python3也不会比Python2.7慢上20%……正如Python之父Guido van Rossum对Python速度慢的评论:如果你开发的系统发现了性能瓶颈,通常最有效率的做法是找到出问题的代码块,用速度较快的语言如C或C++写一些代码替换该功能或该模块,而不是用C或C++重写整个系统,因为对大部分代码而言,语言的速度是无关紧要的。
为Python写C++ extension可参见:http://www.linuxsir.org/bbs/thread227063.html
Python的速度问题,在当今物质极大丰富人民为所欲为的时代,对general-purpose的应用,似乎可以忍受的。第一,这个年代谁没有奔腾酷睿2什么的。你手机的运行能力都可以几毫秒内把你在厕所拍的几千张自拍液化,磨皮,磨骨好几遍了。而且你觉得0.01秒和0.5秒的区别真的那么大么?12秒也不是很久啊。第二,很大程度上程序的慢更关乎于算法,比起O(n)和O(n^2)的区别, 语言间的差异就显得很小了,第三,请注意,如果你使用过Python而且真实的觉得Python慢,那么情看下这个列表:
1. Google创立前的第一个网络爬虫。
2. Quora,美国最大在线知识问答平台,开复哥总是在上面拽文的。
3. Dropbox。
4. BT。
5. 知乎,中国的Quora。
6. 豆瓣,开创社交工具绿色系代表yp的先河。
他们有一个共同点——都是用Python写的!如果tmd的Dropbox没有觉得Python慢,请你也有足够的信心不要觉得Python慢。
代码的简洁性和可读性
写过hello world的人都知道,学语言最好的途径就是写和读(即使是学书面的自然语言)。所以代码的可读性是选择学一门语言的关键因素,因为你代以后会花很多时间读别人的代码。可读性带来的影响是非常深远的。有种说法, 说在遥远的古代阿拉伯数字传入之前欧洲之前, 其数学发展几乎为0, 而造成这种缓慢的原因就是因为复杂的罗马数字的广泛使用。这表明很多时候即使我们不愿意承认, 往往是形式决定的内容. 比如罗马数字没有0,自然很多数学概念就难以发展。所以——如果想以后从此过上幸福的生活, 请不要选用perl。如果不幸选择了perl, 那么就君就 一入侯门深似海,从此萧郎是路人了。当以后你两行清泪的看着自己十天前写的不过10几行的楔形文字时, 你就会明白。
而Python的可读性是我见过最好的:首先,Python的代码格式使用缩进而不是括号。首先节省了很多行数,变得而为紧凑而美观。相传的俄罗斯人偷美国NASA的C代码那个段子满屏括号的情况是不可能出现Python版本的。其次,逻辑相当清晰。循环的结束与开始一目了然。第三,屏幕右方得到充分利用. 比如使用24寸屏幕的人是不是感觉自己总是望着左边编程.....和17寸等高的屏幕区别不大,很费右边的电。
类库齐全
对于我们普通人来说一个语言最重要的还是库函数的齐全程度,Java在此方面已经登峰造极了。而现在的Python不输于他。一个语言的火热程度可以从类库看出, 下面是github上语言的排名: 
由于Javscript的特殊性和Ruby的RoR我们就不去管它了,Python占8%,C占6%. 貌似差得不远, 恩. 但是如果你仔细看C的project,随便翻十页可能发现会有三页的项目其实是在写python的类库. 真是母亲为孩子显出一切。以下是一些常用的类库:
1. 如果你想写网络应用,轻量级:web.py 中量级:Django,Pylon 重量级:tornado。其实很多人诟病Python的网络框架过于多,不能集中起来,我倒觉得无所谓。我用过Django, 写个小小的博客程序,1000多行,这是用java不可想象的。Youtube上有个半个小时的用Django写博客的演示:http://www.youtube.com/watch?v=srHZoj3ASmk 。 半个小时!!一边写一边讲!一个博客程序!!还带后台功能!WTF这NM是编程么!?我脱稿写个平衡树都不只半个小时啊!

2.如果你想做科学计算,NumPy&SciPy可以取代90%matlab的常用功能,然后让我想一想,他们好像只有几十mb!!加上iPython也才700mb多!但是你没有更多的新学语法的成本,也不用付给mathwork血汗钱。

3.网络爬虫。Python的超强项,beautifulsoup的网页解析,scrapy等等,不一而足。Twitter, 微博等好像也有python的API。

4.Machine Learning,数据分析和Natural Language Processing。 请去Kaggle上看看多少参赛者是用的Python。 著名的库有Pandas。

5.写游戏。Pygame。 试过几个别人写出来的游戏,非常顺畅。

6.桌面应用。 pyqt。Dropbox貌似就是使用的pyqt写的。

7.正则表达式。re库是python内置的,表明了Python作为脚本语言对字符串的操作的重视。
8.图形库。小的用过的有PIL
9.数据序列化。pickle,cpickle,marshall。而且重要的一点是Python的库是可以调入进去也可以直接运行使用的。
最后我想讲下Python Challenge。Python作为一个强劲的编程语言有着极为活跃的社区,文档丰富,教程齐全。当然就有很好的网上解谜过关类的教程。Python Challenge是在各个类型的解谜过关性的我看到过的最好的一个。难度适中,而且可以从中学到很多。解法不局限于python,可以用perl, shell,C甚至Erlang!官方解答往往有10多种解法,精妙至极。但是你会一步步从中发现Python的优势。一共33关,在充满乐趣的智力挑战和极大的满足感后,你可以学到PIL库的使用,pickle的使用,正则表达式,完成后你会发现思维方式的改变。

全文完。
浙公网安备 33010602011771号