人生苦短,我用 Python

我接触 Python 并不算早,第一次使用 Python 写生产系统的程序是2004年,那时候我已经有了几年的编程经验。当然了,现在这年头说早晚都不合适,昨天我说2000年就开始使用 Vim 编程了,有小伙伴回复,那年我才12,这……多少有点尴尬

作者:池建强 MacTalk

很久没有挖一个坑转身离去之后,坑边的群众久久驻足不愿离去,不停的冲着黑漆漆的坑底喊话「啥时回来啊~~」。行走江湖,讲究一个信字。Python 这一篇,来了。

我和 Python

我接触 Python 并不算早,第一次使用 Python 写生产系统的程序是2004年,那时候我已经有了几年的编程经验。当然了,现在这年头说早晚都不合适,昨天我说2000年就开始使用 Vim 编程了,有小伙伴回复,那年我才12,这……多少有点尴尬。

早期用 Python 主要写一些服务器端的工具,后来也写后端服务,再后来还写过内容抓取、数据分析和 Alfred 的插件等一系列杂七杂八的东西,简单的工具用 Shell 写,复杂的和庞大的用 C 或 Java 实现,中间的三不管地带,用 Python 就好,每次都不会让你失望。2005到2006年那段时间我参加了一个类似 Corba 的分布式应用系统的开发,与国外的程序员合作,写了大量的 Python 代码。

Python 有什么好处?功能强大,使用简单,语言唯一性的特征明显(唯一性的意思就是你不能用十八种写法实现一个功能),而且具备海量的第三方库……Python 程序员最爱说的一句话是:人生苦短,我用 Python(也是 Python 之父的名言)。这句话与「PHP 是世界上最好的编程语言」一样并世无双,可谓「倚天不出,谁与争锋」。

Python 支持交互式编程、面向对象编程、函数式编程、面向切面编程、当然还有元编程。目前这门编程语言在兵器谱的排名是第四,前三位分别是Java、C 和C++。江湖上人称四哥的,就是 Python。

图0:人生苦短,我用 Python

Python 起源

Python 之父是 Guido van Rossum,荷兰人。每个编程语言的作者都是一个技术传奇,Guido 也不例外。他1982年从阿姆斯特丹大学毕业,获得了数学和计算机两个硕士学位,最爱做的事情就是编写代码。那个时代,流行的语言是汇编、C、Fortran 等,这些语言要求编程者对计算机的运行机制有精确的了解,以充分利用硬件资源达成自己的目标,因为硬件资源实在是太匮乏和宝贵了,程序员们需要榨干计算机硬件的每一滴血和汗才能完成任务。

这给 Guido 带来很多困惑,用 C 实现个功能吧,完成度没有问题,但是需要耗费大量时间。用 Shell 吧,面对复杂问题又束手无策。Shell 是 Unix/Linux 下的脚本语言,也叫胶水语言,它可以把系统的各种功能通过管道(比如:find . -name “*.java” | xargs grep chjq)的方式连接起来实现系统运维、定时任务、文件处理、程序安装卸载等工作,但是处理复杂的数值运算或系统调用就很麻烦。这时候需求就来了,Guido 希望一门语言既能像 C 语言一样能够全面掌控计算机的资源,也能像 Shell 一样使用简单,还具备交互性编程能力,轻轻松松编写一些小的工具包。

普通人 —— 比如我 —— 有了这种需求就会对自己说,再等等,也许隔壁冯老师会做出来呢。冯老师的想法就更简朴了,我又不写代码,关我什么事。幸好 Guido 没这么想,Guido 对自己说的是,放着我来!

1989年的冬天,Guido 为了度过一个有意义的圣诞节,或者为了打发一个无聊的假期,开始编写 Python 语言的编译器和解释器,灵感来自教学语言 ABC(你不知道还有这种语言吧)。为什么叫 Python?因为 Guido 很喜欢 BBC 电视剧 —— 蒙提·派森的飞行马戏团(Monty Python’s Flying Circus)。ABC 则是由 Guido 参加设计的一种教学语言。Guido 一直认为 ABC 这种语言非常优美和强大,是专门为非「专业程序员」设计的。但是 ABC 语言并没有成功,究其原因,Guido 认为是非开放造成的。Guido 决心在 Python 中避免这一错误,这一次他成功了。

1991年,第一个 Python 版本诞生,编译器是 C 语言实现的,Python 语言可以非常方便的调用 C 语言实现的库(这一点太重要了)。从一问世,Python 就是一个动态语言,面向对象编程的语言,具备类、函数、异常处理、列表(list)、词典(dict)、元组等数据类型。

Python 的语法同时受到了 C 和 ABC 语言的影响,比如采用 def 来定义函数,比如等号赋值,比如强制缩进。如果你是个 C 或 Java 程序员,习惯了用大括号来划分程序域 —— 其实大部分语言都是这么做的 —— 看到 Python 是用缩进来搞定这件事,你马上会觉得「Holy shit」,其实这种做法来自 ABC,Guido 的想法是,如果「常识」上确立的东西,没有必要过度纠结。当然,这种常识是 Guido 的常识,至于其他人,你们会习惯的。

事实也是如此, Python 吸引了大量的程序员,他们开始协同改进这门语言,Python 开始了改变世界的征程。

2000年10月16日 Python 2.0 发布,这次增加了实现完整的垃圾回收,并且支持 Unicode 编码。Guido 在开发的过程中一直遵循了开放的原则,社区协作的模式从最初的邮件列表改为开源的方式,Python 吸收了大量开发者和编程语言的特点,比如,Python 中的正则表达参考了 Perl,而内置函数 lambda,map,reduce,filter 等则参考了 Lisp,无数优秀的程序员为 Python 添砖加瓦,Python 搞不定的,没关系,我们用 C 实现,于是 Python 有了大量的函数库,尤其在数据分析和科学计算领域。另外,函数在 Python 中是一等公民,所以 Python 同时也是一种函数式编程语言。

Python 稳步发展,成为了一代老牌编程语言。

Python 的应用

每个编程语言都有自己的 Hello World,Python 最为简单。如果你有台 Mac 电脑,Python 的 SDK 是默认安装的。打开终端,输入 python 进入 python shell 的交互界面,然后键入

>>> print “Hello World”

程序写完了。

Python 这么简单,是不是一门玩具语言呢?当然不是。NASA 的火箭发射仪表盘系统使用了 Python 的 Tkinter —— 支持实时响应的 GUI 库。NASA 的太阳物理学分词库 SunPy 也是基于 Python 写的。YouTube 基于开发速度的考虑,大部分代码是 Python 实现的,YouTube 的流量有多大,老百姓不知道,程序员应该知道。Google、Dropbox 更是大量采用 Python 语言(Guido 工作过的两个地方)。国内的豆瓣、知乎也是 Python 的重度使用者。

虽然 Python 已经被广泛使用了,但前几年它在兵器谱上总是排 8-12 的位置。最近两年事情开始发生变化,去年 Python 开始迅速攀升至第五名,今年更进一步,排名第四。为什么会发生这种变化呢?并不是 Python 增加了什么了不得的特性,而是人工智能和机器学习的时代来临了。

AI 时代的 Python

我来做一个不负责任的判断,Python 将成为大数据、AI 和机器学习时代的第一编程语言。可以想象这样一个场景,Python 和 Java、Go、C、C#、Ruby、PHP……坐在圆桌前开会,Python 抱着头后仰在 Herman Miller 工程椅上,慵懒的对其他编程语言说:

对不起,我不是针对你,我是说,所有在座的各位,都只能挣第二。

当然了,这个语言范畴是限定在大数据、AI 和机器学习领域。但是,如果这个领域在未来的应用足够广泛,那 Python 直接灭掉 Java 当大哥也不是不可能的。

Python 性能这么差,对多核并发编程支持的也不好,并且长期分裂成了 Python 2 和 Python 3 两个阵营,给开发者带来了诸多不便和麻烦,为什么能后来者居上呢?

因为 Python 遵循了现代的木桶原理。

Python 的木桶原理

我在自己的小密圈(目前已经涨价到128元,因为贵即是好)提了一个问题:为什么很多数据分析和机器学习的框架都会选用 Python 做主要的开发或首选支持的语言呢?

一位女程序员颖儿的回答最靠谱:免费,简洁,生态好,库丰富,操心少;之前刷机器学习的题,用 C# 写了一坨儿。结果人家引个 SciPy 库,三行代码搞定。

SciPy 是一个数值计算库,NumPy 是 Python 另一个开源的数值计算扩展库,Pandas 是基于 NumPy 的数据分析工具,matplotlib 是图形绘制库,最近火热的 Scikit-learn 则是开源的机器学习框架。这些库对于 Python 来说就三个字:「随便用」。长此以往,围绕 Python 语言构建出来的生态库让其他语言望尘莫及,尤其是在科学计算、数据分析和机器学习领域。

以前我们说「木桶原理」是讲一只水桶能装多少水取决于它最短的那块木板,所以我们应该去思考和补齐自己的短板,才能成事。到了现代,知识爆炸信息拥堵,没人有时间去补齐短板,能够让自己的长板足够长就不错了。短板怎么办,找别人来补齐啊。能协作的组织和人才是最有生命力的。

Python 也是一样。自诞生以来,一直保持了简单、开放、语言工业化,具备良好的封装、组合、嵌入能力,开发效率惊人。Python 把这些方面做到极致,其他的事情,留给别人去干嘛。

你们不是觉得 Python 慢么,自然有人给开发出 PyPy、Cython、Jython、Numba 这样的编译器工具来提高 Python 的效率。要进行科学计算、大数据分析,好了,SciPy、Pandas 诞生了,要机器学习,scikit-learn、Theano、Pylearn2 等机器学习库开发出来了。Python 调用这些用 C 或者 Fortran 开发出来的库比原生语言调用还方便,你说大家能不用 Python 么?

每当新事物来临的时候,总有很多专家里手对新手们竖起一道高墙,比如机器学习总被放到学术研究和 CS 科班出身这堵墙的后面,让人望而生畏。其实,机器学习这个领域,同样是个金字塔,这些专家和博士以及人工智能算法的创造者们,属于塔尖的极少数人,他们发现原理,实现算法,引领潮流,突破极限,然后呢?基于这些算法和原理开发应用和使用应用的,是广大的程序员和人民群众,他们可能没有那么高深的数学知识,不知道 Regression 和 Decision Tree 算法,不了解散步矩阵……那我们可以用 Python 调包啊,只要那些包足够成熟就好了。

也许未来每个人与机器沟通的每一句话,就是唤起了一段 Python 代码呢?

Python 的分裂

Python 2 和 Python 3 已经长期共存了数年之久,原因很复杂,对于这个话题,足够写另一篇文章了。目前官方表示对 2 的支持到2020年,但 2 的生态库远远大于 3,这就让人很纠结。

关于该学哪个版本的常见问题,我的回复是,最好都学,语法区别并不是很大。

人人都应该使用Python!

阅读余下内容

发表评论

电子邮件地址不会被公开。 必填项已用*标注