// Tutorial //

Python 2与Python 3的对比:从实际出发的考量

Published on November 14, 2019
Default avatar
By Lisa Tagliaferri
Developer and author at DigitalOcean.
中文
Python 2与Python 3的对比:从实际出发的考量

简介

Python是可读性很强,并且用途极其多样的编程语言。它的名字是从英国的喜剧团体“Monty Python”受到启发,因此“让Python语言用起来很有趣”对于Python开发团队来说是非常重要的核心目标。易于安装配置、代码风格相对简单直接、有即时的反馈和报错,这些特性让Python成为编程初学者的一个很好选择。

由于Python是一种“多范式”语言-也就是说它支持多种编程样式,包括“脚本”和“面向对象”,因此非常适用于通用编程,用途广泛。在工业界,Python被诸如United Space Alliance(“美国航天局”主要的航天飞机技术支持承包商)和Industrial Light & Magic(Lucasfilm的特效和动画工作室)这类组织越来越多地使用。拥有Python的基础,将会为学习其他编程语言的人们提供巨大的发展潜力。

Python最初作者是Guido van Rossum(荷兰籍),他现在仍活跃在社区中。Python语言的开发始于20世纪80年代末,并于1991年首次发行。作为ABC编程语言的继任,Python的第一迭代版本中已经包含了异常处理、函数、以及类与继承。 1994年一个重要的、名为comp.lang.python的“用户网络咨询论坛”成立,此后Python的用户群体蓬勃发展,为Python成为“最受欢迎的开源开发语言”铺平了道路。

概述

在研究与Python2和Python3相关的潜在用途、以及它们之间的主要编程句法差异之前,让我们先来了解关于Python近年主要发行版的背景知识。

Python 2

Python 2于2000年底发布,它实现了PEP(Python Enhancement Proposal,“Python改进提议”),这表明Python 2比早期版本Python有更加透明、包容的语言开发过程。PEP是一个技术规范,可以向Python社区成员提供信息,也可以描述该语言的新特性。

此外,Python 2包含了更多的编程功能,其中包括:周期检测垃圾收集器(用于自动化内存管理)、增加Unicode支持(使字符标准化)、以及“列表解析”(基于现有列表创建列表)。随着Python 2的不断发展,更多的功能加入其中,例如python 2.2版,将Python的类型(types)和类(classes)统一到一个层级结构中。

Python 3

Python 3被认为是Python的未来,也是当前正在开发的版本。作为一项重大改革,Python 3发布于2008年末,旨在解决和修正Python语言之前版本中存在的固有设计缺陷。Python 3的开发重点是清理代码库和消除冗余,使一种既定的任务只有一种方法去实现,让语言更加清晰明了。

Python 3.0版中的重大修改包括:把print语句改成一个内置函数、改进整数除法、增加更多的Unicode支持。

起先,Python 3的采纳使用非常缓慢,因为它不向后兼容Python 2,需要人们去决定使用哪个版本。此外,许多第三方库一开始仅支持Python 2。但由于Python 3的开发团队重申强调了对于Python 2的支持即将结束,之后更多的库已移植到了Python 3。通过提供Python 3支持的第三方包的数量,我们可以了解“Python 3被越来越多采用”的这个事实。在这份教程的英文版定稿时,360个最流行的Python包中,有339个已支持Python 3。

Python 2.7

继2008年Python 3.0发布之后,Python 2.7于2010年7月3日发布,并计划作为2.x版本中的最后一版。Python 2.7存在,是为了让Python 2.x用户更容易将特性移植到Python 3上,因此2.7提供了某种程度的兼容性。这种兼容性支持包括2.7版的增强模块,如支持自动化测试的unittest、用于命令行中句法分析的argparse,以及collections中更方便的类。

由于Python 2.7有着“介于Python 2和Python 3.0早期迭代版之间”的独特地位,它与许多健全的库兼容。因此Python 2.7在程序员中一直是非常流行的选择。当我们今天谈到Python 2时,我们通常指的是Python 2.7(因为它是最常用的版本)。

然而Python2.7被认为是一种将会停止支持的遗留语言,它的持续开发(目前主要是修改bug)将于2020完全停止。

关键区别

尽管Python 2.7和Python 3具有许多类似功能,但它们不应该被认为是可以完全互换的。虽然你可以在任一版本中写出“好代码”和“有用的程序”,但需要了解的是,它们在代码语法和处理上会有相当大的区别。

下面是一些例子,但请记住随着继续学习Python,你可能会遇到更多的语法差异。

打印(Print)

在Python 2中,print被视为语句而不是函数,这是一个典型的易引起混淆的地方,因为Python中的许多其他操作都需要括号内的参数来执行。如果你想在命令行中用Python 2打印Sammy the Shark is my favorite sea creature,可以使用以下print语句:

print "Sammy the Shark is my favorite sea creature"

现在,在Python 3中print()被明确地定义为一个函数,因此想打印上面相同的字符串,可以使用函数的语法简单容易地执行此操作:

print("Sammy the Shark is my favorite sea creature")

这一变化使得Python的语法更加一致,也更易于在不同的打印函数之间进行更改。print()句法同样向后支持Python 2.7,因此 Python 3的print() 函数可以方便地在任一版本中运行。

整数除法

在Python2中,任何不带小数的数字都被视为整数integer)。乍一看这似乎是处理编程类型的一种简单方法,但当整数相除时,有时你希望得到一个带有小数位的答案,被称为浮点数(float),比如:

5 / 2 = 2.5

然而,在Python 2中整数是强类型,即使在凭直觉应当转换为带小数点的“浮点数”(float)的情况下,也不会转换。

当除法/符号两边的两个数字是整数时,Python 2执行向下取整floor division)。因此对于商x,返回的数字是小于或等于x的最大整数。这意味着使用5/2进行这两个数字的除法时,Python 2.7将返回小于或等于2.5的最大整数,在这个例子中为2

a = 5 / 2
print a
Output
2

若想强制覆盖这种行为,你可以添加小数位5.0/2.0,以获得预期的答案2.5

在Python 3中, 整数除法 变得直观,比如:

a = 5 / 2
print(a)
Output
2.5

你依然可以使用5.0 / 2.0去得到2.5,但是如果想向下取整运算,应该使用Python 3的语法//,如下所示:

b = 5 // 2
print(b)
Output
2

Python 3中的这个修改使得整数除法更加直观,这个句法向后兼容Python 2.7。

Unicode支持

当编程语言处理字符串类型 字符串 (也就是一串字符)时,他们可以用几种不同的方法来实现,这样计算机可以把数字转换成字母和其他符号。

Python 2默认使用ASCII字母表, 因此当你输入 "Hello, Sammy!"时Python 2会将字符串作为ASCII进行处理。ASCII在各种扩展形式中,也最多只有几百个字符。因此ASCII不是一种非常灵活的字符编码方式,尤其是非英语字符。

若是想使用更加通用和健全的Unicode字符编码(它支持超过128000个字符,跨越当代和历史上的各类脚本和符号集),你必须键入u"Hello, Sammy!",其中u前缀表示Unicode。

Python 3默认使用Unicode,这为程序员节省了额外的开发时间。而且你可以轻松地在程序中直接输入和显示更多字符。Unicode支持更大的语言字符多样性,以及emojis(表情符号)的显示。因此使用它作为默认字符编码,可以确保你的开发项目能无缝支持世界各地的移动设备。

不过若希望你的Python 3代码向后兼容Python 2,你可你以在字符串之前保留u

持续发展

Python 3和Python 2之间最大的区别不是语法,而是Python 2.7将在2020年失去后续支持,但Python 3将持续发展更多的功能特性,以及持续修复Bug。

Python 3最近的发展包括格式化字符串文本,更简单地定制类的创建,以及更简洁的处理矩阵乘法的语法。

Python 3的持续发展意味着程序员可以确信:Python 3语言中的问题会及时得到修复,并且功能会随着时间的推移而增加,程序的效率会变得更高。

需要考虑的其他要点

作为一个用Python入门的新手程序员,或者不熟悉Python的有经验程序员,你需要考虑:想在Python学习中实现什么。

如果只是想在“不考虑既定项目”的情况下学习,那么你应该优先考量:Python 3将继续得到支持和开发,而Python 2.7不会。

但如果你正计划加入现有项目,你应当看看:团队使用的Python版本、不同的版本如何与老代码库进行交互、项目使用的包是否被不同的版本支持、以及项目的实现细节。

如果你打算开始一个新的项目,那么应该研究哪些包可以使用,这些包与哪个版本的Python兼容。如上所述,尽管早期版本的Python 3与那些“为Python 2构建的库”兼容性较低,但许多版本已经移植到、或是承诺在未来四年内移植到Python 3。

总结

Python是一种用途广泛、文档齐全的编程语言,无论选择使用Python 2还是Python 3,你都可以写令人兴奋的软件项目。

尽管有几处重要不同,但是只要稍加调整,从Python 3迁移到Python 2并不太难。并且你常会发现python 2.7可以轻松运行python 3的代码,特别是在你刚开始学习时。你可以通过阅读这个教程,去了解更多信息如何将Python 2代码移植到Python 3.

需要记住,随着更多的开发人员和社区关注于Python 3,它将变得更加精炼,并符合程序员不断发展的需求。而对于Python 2.7的支持将会逐渐减少。


Want to learn more? Join the DigitalOcean Community!

Join our DigitalOcean community of over a million developers for free! Get help and share knowledge in our Questions & Answers section, find tutorials and tools that will help you grow as a developer and scale your project or business, and subscribe to topics of interest.

Sign up
About the authors
Default avatar
Developer and author at DigitalOcean.

Default avatar
Gongxia Chen

translator

Developer and author at DigitalOcean.

Still looking for an answer?

Was this helpful?
Leave a comment

This textbox defaults to using Markdown to format your answer.

You can type !ref in this text area to quickly search our full set of tutorials, documentation & marketplace offerings and insert the link!