微信号:sagacity-mac

介绍:MacTalk 开通于2012年末,内容起于 Mac 而不止 Mac,内容覆盖了技术、创业、产品和人文思考.文风有趣,又有一点力量.相关图书《MacTalk·人生元编程》《MacTalk·跨越边界》

人生苦短,我用 Python

2018-05-29 08:30 池建强

题图:by karl_shakur from Instagram

经常有新人或编程爱好者问我,如果想学编程,应该从哪门语言入手,以前我一般会推荐 Java 和 Python,现在则只推荐 Python。2017年上半年我写了一篇 Python 的文章,现在看来,Python 的发展势头有增无减,尤其是在工具脚本、数据爬取、数据分析和人工智能领域。之前的一篇「4月 GitHub 最热的机器学习开源库」,大部分库语言都是 Python,可见一斑。

我和 Python

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

早期用 Python 主要写一些服务器端的工具,后来也写后端服务,再后来还写过内容抓取、数据分析和 Alfred 的插件等一系列杂七杂八的东西。简单的工具用 Shell 写,复杂的和庞大的用 C 或 Java 实现,中间的三不管地带,用 Python 就好,每次都不会让你失望。

Python 有什么好处?功能强大,使用简单,语言唯一性的特征明显(唯一性的意思就是你不能用十八种写法实现一个功能),而且具备海量的第三方库……Python 程序员最爱说的一句话是:人生苦短,我用 Python(也是 Python 之父的名言)。

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

我曾经提了一个问题:为什么很多数据分析和机器学习的框架都会选用 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 么?

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


写了这么多其实就是想告诉大家,在这个时代,每个互联网人都应该掌握一门编程语言,如果你愿意学习,我们可以提供这样一个入口。今天极客时间上新了「零基础学 Python」课,这个课以 Python3 为基础讲授,帮助读者走进编程的世界。

课程面向对象是编程新人、编程爱好者和希望转向 Python 编程的工程师。原价199,预售期优惠价 99,扫码购买返现 12 元。祝学得开心:)

 
MacTalk 更多文章 坚果 R1 是一部好手机吗? 洗稿和价值审判 ifconfig:最熟悉又陌生的命令行 用 Python 语言来写游戏 好好做手机不好么,做什么 TNT?
猜您喜欢 Android 跨进程通信Aidl的使用及注意事项 大学生与民工的区别,无奈! 某学姐带你学习抓包原理 把自己的Python包部署到PyPi 傅盛分享:工作是最好的修行