Python 2.X 和 3.X 系列

因为 Python 2.X 和 3.X 的历史故事对本书的内容影响很大,所以我需要提前提一些这方面的事情。 在 2009 年写完本书的第四版时, Python 只是刚刚有两种不同的版本:
  • 版本 3.0 是本语言出现的第一个不兼容的变种,一般称为 3.X。
  • 2.6 保持了与大量现存 Python 代码的后向兼容性,并且在 2.X 这个系列中是最新的。
虽然 3.X 几乎是同样的语言,但是它和前面的版本运行的代码基本完全不同。它:
  • 强制推行了一个 Unicode 的模型,对字符,文件和库都有深远的影响。
  • 让迭代器和生成器的作用更广泛,作为更完全功能范式的一部分。
  • 强制推行和 types 一起出现的新式的 classes,但更加强大和复杂。
  • 改变了许多基本的工具和库,把其它的完全替代和移除。
print 从语句到单独函数的转变,从美感上来说或许是合理的。但是它几乎破坏了每一个已经写好的 Python 程序。不谈战略潜力,3.X 的强制的 Unicode 和类模型,还有无处不在的生成器都会造成不同的编程体验。 虽然许多人认为 Python 3.X 是 Python 的进步和未来,但 Python 2.X 仍然广泛使用,并且将在未来的数年和 Python 3.X 获得并行的支持。大量在使用的 Python 代码都是 2.X 的,向 3.X 的迁移过程看起来发展得比较缓慢。 到如今 2022,Python 3.X 早已经获得了统治地位。目前最新版本是 3.11.0. Python 2.7.18 在 2020 年 4 月 20 日 发布后,2.X 系列就再没有发布过更新了。

Python 2.X 和 3.X 系列 —— 今日故事

在 2013 年编写第五版的时候, Python 已升级到 3.3 和 2.7 版本。但是 2.X/3.X 的故事仍然几乎没有改变。事实上, Python 现在是一个双版本的世界,许多用户根据它们软件的目标和依赖同时运行 2.X 和 3.X 。对于许多新手来说,在 2.X 和 3.X 中的选择仍然存在 —— 现存软件对语言的最新技术。虽然许多主要的 Python 包都已经移植到 3.X,但是目前仍然有许多其它(包)只在 2.X 上。 对于一些观察家来说, Python 3.X 现在被视作探索新想法的沙盒,而 2.X 被视为久经证明的 Python,它没有 3.X 的所有功能,但是仍然使用得更广泛。其它人仍然认为 Python 3.X 是未来,一个观点似乎被当前的核心开发者计划所支持:Python 2.X 将继续被支持,但它是最后的 2.X 然而 3.3 是 3.X 系列持续进化中最新的版本。另一方面,像 PyPy 这种提议 —— 现在仍然只是一个 2.X 的 Python 实现,它提供了非常好的性能提升 —— 如果它不代表一个完全的派系,那么就代表了 2.X 的未来。 搁置所有的意见,在 3.X 发布 5 年后,它的用户基数还是没有超过甚至是匹配 2.X 的。作为一个指标,2.X 目前在 python.org 上 的 windows 平台 的下载量 仍然比 3.X 的要多,尽管事实上这个标准会自然地倾向于新用户和最近的发布。当然,这种统计是很容易改变的,但在 5 年后(还是如此)表明了 3.X 的普及(不如预期)。现存的 2.X 软件基础仍然超过 3.X 的语言扩展许多。而且,作为 2.X 系列的最后一个版本,使得 2.7 处于某种事实上的标准,而不会被 3.X 系列中持续地更改所影响 —— 这对那些寻求稳定版本的是一个好事,但是对那些寻求增长和持续相关的人是一个坏消息。 个人来说,我认为今天的 Python 世界已经大到足够同时容纳 3.X 和 2.X;它们看起来满足不同阵营的目标和需求。而且对于这种现象在其它语言家族中也有先例(比如 C 和 C++ 就有长期的共存。虽然它们之间的不同比和 2.X 和 3.X 的不同更多)。而且因为它们如此相似,通过学习任一 Python 系列获得的技巧,几乎能完全地转换到另外一个系列。特别是如果你被像本书这样的双版本资源帮助的话。事实上,只要你懂得它们是如何出现分歧的,通常是可能写出在两个版本上都能运行的代码。 同时这个分歧让程序员和图书作者处于两难境地,而且没有减弱的迹象。虽然对一本书来说,假装 Python 2.X 从来不存在,然后只讲解 3.X 会更容易,但是这不会解决目前存在的庞大的 Python 用户群的需求。大量现存的代码是为 Python 2.X 写的,它不会在短期内消亡。虽然一些语言的新手能够并且应该主要关注 Python 3.X,但是任何必须使用老代码的人目前都仍需要保持一只脚在 Python 2.X 的世界。许多第三方的库和扩展被转移到 Python3.X 还有几年,这个分歧可能不会是完全临时的。 本文章首发在 LearnKu.com 网站上。

上一篇下一篇

Markdown 文本

纠错改进


Python 2.X 和 3.X 系列 —— 同时教授 3.X 和 2.X

为了解决 3.X 和 2.X 的对立,并且满足所有潜在读者的需求,本书已经升级到 Python 3.3 和 Python 2.7,并且应该适用于 3.X 和 2.X 系列的后续版本。它适用于 使用 Python 2.X 的程序员和使用 Python 3.X 的程序员和鉴于两者之间的程序员。 也就是说你可以使用这本书来学习任意一个 Python 系列。虽然经常强调 3.X ,但也提及了 2.X 的不同和工具也在这个过程中被提及。对那些使用更旧代码的程序员来说,虽然这两种版本都是很相似的,但是它们在一些重要的情况下有分歧。当这种情况出现时,我会把它们指出来。 比如在大多数例子中,我将使用 3.X 的 print 调用,但是也会描述 2.X 的 print 语句,这样你就能理解更早的代码,然后还将经常使用可移植的在两个系列中运行的打印技术。还将自由地介绍新的特性,比如 3.X 中的 nonlocal 语句和从 2.6 和 3.0 开始可用的字符串 format 方法,还将指出什么时候这些扩展在更老的 Python 中不存在。 在某种程度上,这版书还解决了其它 Python 2.X 和 3.X 的问题,虽然一些更老的 2.X 版本的代码可能不能运行本书中所有的例子。比如虽然类装饰器从 Python 2.6 和 3.0 就都可用了,但你不能在任何没有这个功能的更老的 Python 2.X 中使用它们。再次参阅附录 C 中的变更表,获取最近 2.X 和 3.X 变化的摘要。 本文章首发在 LearnKu.com 网站上。

上一篇下一篇

Markdown 文本

纠错改进


Python 2.X 和 3.X 系列 —— 我应该使用哪一个 Python?

组织可能强制选择了版本,但如果是自学 Python 的初学者,可能会想知道要安装哪一个版本。答案取决于目标。这里是关于选择的一些建议。

何时选择 3.X —— 新特性,进化

如果是第一次学习 Python,不需要使用任何现存的 2.X 代码,鼓励从 Python 3.X 开始,它清除了一些语言里长期存在的不受欢迎的功能并去除了一些过时的繁杂代码,同时保留了原来所有的核心理念,添加了一些好的新工具。比如 3.X 的无缝 Unicode 模型和对生成器和函数技术的更广泛使用,这些被许多用户视作优势。许多流行的 Python 库和工具已经在 3.X 中可用,或者将在你读到这些文字的时候可用。特别是考虑到 3.X 系列的持续改进。所有新的语言进化都只发生在 3.X,它添加了很多功能并保持 Python 技术时刻更新,但是也使得语言的定义不断变化 —— 这是在尖端技术上的一个与生俱来的妥协。

何时选择 2.X —— 现成的代码,稳定性

如果将使用一个基于 Python 2.X 的系统,3.X 系列就不是目前的选项。然而你也会发现这本书解决了你的疑惑,如果你迁移到 3.X 的话,它还将在未来帮助你。你会发现自己处于一大帮同伴之中。我在 2012 年教授的每一个小组都只使用 2.X,并且我现在仍然经常看见只使用 2.X 的 Python 软件。而且,不像 3.X,2.X 不再被改变,这既是一个优点(稳定),也是一个缺点(没有更新技术),取决于你问的是谁。使用和编写 2.X 代码是没有任何问题的,但是你可能希望密切监视 3.X 和它不断进行的进化,就像你自己那样。Python 的未来还有待书写,并且很大程度上取决于它的用户,包括你。

何时选择两者:版本中立代码

可能最好的消息是 Python 的基础在两个系列中是一样的 ——2.X 和 3.X 只在许多用户看来是很小的地方有不同,并且这本书设计来帮助你学习二者。事实上只要理解了它们的不同,通常是很容易写出可以运行在两个 Python 上的版本中立代码,就像我们经常在本书中做的那样。参见附录 C 获取关于 2.X/3.X 迁移的指示和如何为两个 Python 系列和观众书写代码的提示。 不管你首先关注哪个版本,你的技能将会直接应用到 Python 工作中,而与具体使用的版本无关。

注意

关于 Xs:在整本书中,3.X 和 2.X 用来总体的指这两个系列当中的所有版本。比如 3.X 包含 3.0 到 3.3 和未来的 3.X 版本。2.X 意味着所有从 2.0 到 2.7(假如没有其它的)。更具体的版本只在一个主题应用到它的时候会被提及(比如 2.7 的 set 字面量和 3.3 的安装程序和命名空间包)。这个标记法有时会太宽泛 —— 一些标记为 2.X 的功能可能在早期很少使用的 2.X 版本中并不存在 —— 但是它包含了一个跨越 13 年的 2.X 系列。3.X 的标记更简单和准确地应用于这个更年轻的 5 年系列。