首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python 之父说 Python 历史

Python 之父说 Python 历史

作者头像
哒呵呵
发布2020-07-09 15:33:19
9080
发布2020-07-09 15:33:19
举报
文章被收录于专栏:鸿的学习笔记鸿的学习笔记

这篇文章主要内容来源于 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 的中文是“蟒蛇”的意思,而且 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 为什么不是一门函数式编程语言,却有着函数式编程语言特性的解释,等等。

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-07-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 鸿的笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 发明 Python 的动机
  • 为什么 Python 要叫 Python ?
  • Guido 眼里的 Python 是什么样的?
  • Python 的设计哲学
  • Python 为什么会使用缩进和冒号(:)区分编程语句?
  • 总结
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档