前言

本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。

作者:鸿影洲冷

这篇文章主要内容来源于 Python 编程语言的最初设计者及主要架构师 Guido van Rossum 的博客 The History of Python(http://python-history.blogspot.com/)。博客文章不多,只有32篇而已,但是 Guido van Rossum 在这个博客里叙述和解释了 Python 一些重要特性的发明历史和这个特性诞生的原因,比如为什么 Python 会叫 Python,Python 为什么会使用缩进区分编程语句等等,有些特性很平常,而且替代选择也很多,至于为什么会选择其中一个,使用者往往不好回答,而对于最初设计者而言,却轻而易举。

发明 Python 的动机

Guido 大学毕业后加入了 CWI ,CWI 是荷兰的一家研究中心,它由荷兰政府教育部和其他研究基金资助,对计算机科学和数学进行学术级的研究。在 CWI 中,Guido 参与了 Amoeba 项目。Amoeba 项目是由 Andrew Tanenbaum 负责,CWI 和 Vrije Universiteit Amsterdam 两所机构共同参与开发的基于微内核的分布式系统。

在 Amoeba 项目中,Guido 发现用 C 语言开发系统管理程序所花费的时间太长了,而且因为 Amoeba 是一个全新的底层操作系统实现,导致了和原有的 Bourne shell 不兼容,在 Bourne shell 中无法执行 Amoeba 项目中的一些程序。这些原因让 Guido 意识到它需要一个能够弥合 C 和 shell 之间鸿沟,更高抽象级别、更加简单的编程语言去完成工作任务。

于是 Python 诞生了。

同样的 Guido 也在文章中解释了为什么选择造轮子发明 Python,而不是移植其它编程语言 ?那是因为当初并没有其它编程语言可以完成这些任务。

Python基础入门资料加群免费领取

资料就在群文件里放着哟

为什么 Python 要叫 Python ?

Python 的中文是“蟒蛇”的意思,而且 O’Reilly 出版社也用蟒蛇图片作为了 Python 相关书的封面(O’Reilly 非常喜欢用动物图片去作为其出版物的封面),平时看过的一些关于 Python 文章想当然的认为 Python 这门语言与蟒蛇关联上了,但实际上 Guido 并不喜欢将 Python 与蛇关联上。

For many years I resisted attempts to associate the language with snakes.

Guido 使用 Python 这个名字的灵感来源于他喜欢的一个马戏团的名字 Monty Python,并且他认为使用 Python 更具有 IT 行业一贯以来的不拘一格的个性。也符合编程语言的名称来源于名人的名字的习惯。

The word “Python” was also catchy, a bit edgy, and at the same time, it fit in the tradition of naming languages after famous people, like Pascal, Ada, and Eiffel.

Guido 眼里的 Python 是什么样的?

Guido 在博客的开篇便提起了他所认为的 Python 是什么样的一门语言,从中摘抄几个核心设计点:

  1. Python 大量的采用了 C 语言里面的设计,比如 if、else 等关键字都直接来源 C 语言。但是放弃了 C 语言的大括号和分号,选择了缩进去区分不同的编程语句。
  2. Python 是一门动态语言,不像 C 语言一样需要预先声明变量和指定变量类型,,因此 Python 里的变量只是所引用对象的名称,并且也可以在程序运行时改变变量类型。
  3. Python 内置了大量的数据类型,包括布尔(Boolean)、数字(Number)和字符串(String)等,这些类型都是不可变的。除此以外还有像列表、元组和字典这种容器型的数据类型。
  4. 为了程序的模块化,Python 引入了包(packages)、模块(modules )、类、方法和函数。为了流程控制,Python 提供了 if/else、while 和可迭代的实例。为了处理程序异常,Python 使用了 Exception 语法,raise 关键字可以抛出异常(exception),try/except/finally 可以处理异常。
  5. Python 的所有对象都是一等对象,这意味着函数、类、方法、模块和所有的其他对象都可以在运行时自由地传递,并放入在各种数据结构(例如列表或字典)中去。
  6. 同样的,Python 还支持面向对象编程。
  7. 除了自身特性外,Python 还拥有着大量的标准库和第三方库,方便使用者完成各种各样的需求。
  8. 最后,Python 的标准实现使用 C 语言实现的,但是 Python 不仅仅局限于 C 语言,它也可以用 Java(Jython)、Microsoft .NET(IronPython),甚至是 Python 自己实现(PyPy)。

注意到没有,Guido 在开篇从未提到 Python 是一门追求性能的语言,至于为什么,在下一章提到 Guido 的设计哲学会提到,为什么 Python 不会一味地追求性能。

Python 的设计哲学

在了解 Python 的设计哲学之前,首先要知道 Python 在刚开始时是一个一个人独自维护的项目,没有任何官方预算,也没有任何其它支持,并且 Guido 也希望能尽快出结果。这些因素影响了 Python 的设计哲学。

First of all, Python was originally conceived as a one-person “skunkworks” project – there was no official budget, and I wanted results quickly

可以偷懒的设计哲学:

  • 尽可能从其他地方借用想法。
  • “事情应该尽可能简单,但不要简化。” (爱因斯坦)
  • 只做好一件事情(UNIX哲学思想)。
  • 不要对性能太担心-以后有需要时,再进行优化。
  • 不要与环境(environment)抗争,顺其自然。
  • 不要追求完美,“足够好”就可以了。
  • (因此)有时可以偷工减料,后续可以想办法弥补。

这些设计哲学帮助 Guido 在实现 Python 时节省了大量的宝贵时间,没有陷入到没有必要的细节中去;在不应该节省时间的地方,Guido 花费了大量的时间去精雕细琢。Guido 在 Python 这门语言中展现了他对实现细节本身和实现细节所需要花费时间的平衡的把握程度。

不可以偷懒的设计哲学:

  • Python 不能仅仅运行在某个特定平台(Linux 或者是 Windows)上,虽然 Python 在一些平台上的某些功能并不总是可用的,但是其核心功能应该在任何平台上都可以使用。
  • 不要用机器可以处理的细节去打扰用户,也就是说,机器能够完成的,就需要用户去实现它。
  • 支持和鼓励只能运行于特定平台的用户代码,但不能让用户不能访问对平台本身的功能或特性(这与Java形成了鲜明对比)。
  • 一个大型的复杂系统应具有不同级别的抽象扩展能力,这可以为有想法的的用户(无论其是否熟练)提供最大的自由去实现他想要的功能。
  • 错误不应该是致命的,也就是说,只要虚拟机仍在运行,用户代码就能够从错误状况中恢复过来。
  • 同样的,错误不应该被静默地传递。
  • 不应该让用户 Python 代码中的 bug 导致 Python 解释器出现未定义行为。
  • 最后,为了尽可能保持 Python 的可读性,标点符号使用应该符合书面英语或高等代数中的常用用法,除非遇上了编程语言里的历史传统(比如用 x * y 表示乘法)。

就像 Guido 所说的那样,这些设计哲学正是让 Python 获得如此巨大成功的主要原因之一。

In many ways, the design philosophy I used when creating Python is probably one of the main reasons for its ultimate success. Rather than striving for perfection, early adopters found that Python worked "well enough" for their purposes. As the user-base grew, suggestions for improvement were gradually incorporated into the language.

Python 为什么会使用缩进和冒号(:)区分编程语句?

Python 使用缩进区分编程语句来源于 ABC 编程语言,但是这个想法并非起源于 ABC,它是 Donald Knuth 所提倡的一种著名的编程风格( occam 编程语言也使用过它)。但是,ABC 编程语言的作者确实发明了使用冒号将导入语句(lead-in clause)与缩进块(indented block)分开的方式。

至于为什么要引入冒号进一步区分编程语句,是因为在一项早期的用户测试中发现单纯地使用缩进去区分语句,会让一些用户产生疑惑,影响了他们对编程语言的学习。而后面在编程语言里添加了冒号去区分编程语句,就会引起用户对后续内容的注意,从而帮助用户将前后的编程语句联系起来(想想 if/else、while 和 for 语句)。

总结

除了上文提到,The History of Python 这个博客中还聊了很多,比如有对列表推导和迭代器历史的叙述,还有对 Python 为什么不是一门函数式编程语言,却有着函数式编程语言特性的解释,等等。

通过对这些历史的了解,读者朋友可能在某个时刻写着写着代码,用到了某个特性,想到了它的历史,便会心一笑:原来如此,心情也会豁然开朗。

Python 之父说 Python 历史的更多相关文章

  1. Python的未来和Python的意义 & pypy & JIT

    今天在读关于Lisp的文章,感概于这门语言的生命力(Link).同时也读到了关于python的文章,Python之父谈Python的未来(Link) 文章中拿Python和Javascript作比较, ...

  2. Python 之父撰文回忆:为什么要创造 pgen 解析器?

    花下猫语: 近日,Python 之父在 Medium 上开通了博客,并发布了一篇关于 PEG 解析器的文章(参见我翻的 全文译文).据我所知,他有自己的博客,为什么还会跑去 Medium 上写文呢?好 ...

  3. Python 之父为什么嫌弃 lambda 匿名函数?

    Python 支持 lambda 匿名函数,其扩展的 BNF 表示法是lambda_expr ::= "lambda" [parameter_list] ":" ...

  4. Python之父Guido在最近一次采访的最后说了啥

    Python之父Guido在最近一次采访的最后说了啥? 在前些天的一次采访中,被问到Python未来发展方向的时候原文在infoworld,咱们可爱的python老爹Guido是这样说的: One t ...

  5. Python之父重回决策层

    在Guido van Rossum(吉多·范罗苏姆)卸任BDFL(“终身仁慈独裁者”)一职半年多之后,Python社区迎来了新的治理新方案:指导委员会模式,而经过投票Guido van Rossum也 ...

  6. Python之父重回决策层,社区未来如何发展?

    春节假期结束了,大家陆续地重回到原来的生活轨道上.假期是一个很好的休息与调节的机会,同时,春节还有辞旧迎新的本意,它是新的轮回的开端. 在 Python 社区里,刚发生了一件大事,同样有开启新纪元的意 ...

  7. Python 之父谈放弃 Python:我对核心成员们失望至极!

    Python 之父讲述退位原因,以及 Python 的未来将何去何从. ​ 在 Python 社区,Python 的发明者 Guido Van Rossum 被称为 “仁慈的终生独裁者”(BDFL,B ...

  8. Python之父新发文,将替换现有解析器

    花下猫语: Guido van Rossum 是 Python 的创造者,虽然他现在放弃了"终身仁慈独裁者"的职位,但却成为了指导委员会的五位成员之一,其一举一动依然备受瞩目.近日 ...

  9. Python 之父再发文:构建一个 PEG 解析器

    花下猫语: Python 之父在 Medium 上开了博客,现在写了两篇文章,本文是第二篇的译文.前一篇的译文 在此 ,宣布了将要用 PEG 解析器来替换当前的 pgen 解析器. 本文主要介绍了构建 ...

随机推荐

  1. 基于Nginx实现访问控制、连接限制

    0 前言 Nginx自带的模块支持对并发请求数进行限制, 还有对请求来源进行限制.可以用来防止DDOS攻击.阅读本文须知道nginx的配置文件结构和语法. 1. 默认配置语法 nginx.conf作为 ...

  2. kka-typed(5) - cluster:集群节点状态监视

    akka-cluster对每个节点的每种状态变化都会在系统消息队列里发布相关的事件.通过订阅有关节点状态变化的消息就可以获取每个节点的状态.这部分已经在之前关于akka-cluster的讨论里介绍过了 ...

  3. 自己动手实现深度学习框架-7 RNN层--GRU, LSTM

    目标         这个阶段会给cute-dl添加循环层,使之能够支持RNN--循环神经网络. 具体目标包括: 添加激活函数sigmoid, tanh. 添加GRU(Gate Recurrent U ...

  4. 实验二 Linux系统简单文件操作命令

    项目 内容 这个作业属于哪个课程 班级课程的主页链接 这个作业的要求在哪里 作业要求链接接地址 学号-姓名 17041428-朱槐健 作业学习目标 1.学习在Linux系统终端下进行命令行操作 2.掌 ...

  5. Autoware 进行 Robosense-16 线雷达与 ZED 双目相机联合标定!

    项目要标定雷达和相机,这里记录下我标定过程,用的速腾 Robosense - 16 线雷达和 ZED 双目相机. 一.编译安装 Autoware-1.10.0 我没有安装最新版本的 Autoware, ...

  6. 基于使用ISCSI存储的ibmmq通过heartbeat实现HA方案以及碰到的问题总结

    一.背景 ibmmq是一种传统架构的mq产品,运行稳定,有其自身优点,但在高可用(HA)这一块需要使用公司根据自身需求选用高可用(HA)产品,但由于市面HA商业产品较贵,所以使用linux操作系统级的 ...

  7. centos6 升级python2.6 到 python2.7

    由于开发库依赖于python27,而自己安装的centos6.8自带的python是2.6.6. 因为centos的yum依赖于python26因此不打算覆盖26. 步骤如下: 1.官网下载源码压缩包 ...

  8. linux服务器安装宝塔以及一些坑

    首先在linux 下运行这一步命令yum install -y wget && wget -O install.sh http://download.bt.cn/install/ins ...

  9. WeChair项目Beta冲刺(3/10)

    团队项目进行情况 1.昨日进展    Beta冲刺第三天 昨日进展: 昨天工作开始有条不紊地进行着,大家积极交流 2.今日安排 前端:扫码占座功能和预约功能并行开发 后端:扫码占座后端逻辑和预约功能逻 ...

  10. const变量的修改

    int main(){ const char a[]="hello world"; char *aa=(char *)a; printf("\nthe a address ...