首页 > Python笔记 阅读数:25

Python 2.x和3.x的关系和区别

众所周知,Python 官方同时支持两个版本,Python 2.x 和 Python 3.x。截至 2020 年 1 月,它们的最新版本分别是 2.7 和 3.7。由于一些历史遗留问题,这两个版本无法兼容,甚至部分语法都不一致,这给用户带来了困扰。

大家不禁要问,Python 2.x 和 Python 3.x 到底是什么关系?用 Python 官方的一句话可简明扼要地道出二者的区别:“Python 2.x 是过往的历史,而 Python 3.x 则代表当下和未来。”

但鉴于历史的惯性,Python 2.x 还有着庞大的用户群。所以,Python 官方不得不同时维护这两个不同版本的生态系统。

得不同时维护这两个不同版本的生态系统。但按 Python 官方的说法,Python 3.x 会不断吐故纳新,昂首阔步地大发展,而 Python 2.x 的版本将会定格在 2.7,他们只会对其做补丁级别的小修小补。

可以相信,随着时间的推移,Python 3.x 一定会成为编程世界的主流。有一个标志性事件验证了这一趋势的到来。2017 年 11 月,数据处理领域的股肱之臣— NumPy 项目宣布,将在 2020 年停止对Python 2.x 的支持,因为继续支持 Python 2.x 正日益成为该项目的巨大负担。无独有偶,大名鼎鼎的 Pandas 也相继宣布,自 2020 年 1 月起不再提供对 Python 2.7 的技术支持。

因此,放眼于未来,本教程选择 Python 3.x 作为后续代码演示的载体。

Python 2.x 和Python 3.x的主要区别

考虑到 Python 2.x 还被广泛使用,Python 社区也提供了部分方案以解决二者的兼容性问题。下面我们列出 Python2.x 和 Python3.x 的主要区别。

1) 字符编码方式的差异

Python 3.x 中所有字符的编码方式都是 unicode。在 Python 2.x 中,定义 unicode 字符时需要在字符前面显式加上标识符 u,但在 Python 3.x 中则不需要。针对这种差异,可以在 Python 2.x 源文件中导入 __future__“未来包”,妥善处理二者的兼容性问题,具体如下。

from_future_import

导入该包以后,Python 2.x 即可使用 Python 3.x 的未来特性,即在 Python 2.x 中定义的普通字符将自动识别为 unicode 字符。

2) print操作的差异

在早期的 Python 2.x 中,print 是关键字,到了 Python 3.x 中,print 变成了一个函数。事实上,Python 2.6 以后也提供了 print 函数。既然是函数,输出内容就会被当作函数的参数包裹在一对括号之内。而 Python 2.x 则不需要这对括号。我们可以对比如下代码的差异。

#只能在 Python 2.x 中这么用:
print 'Hello'
#Python 2.x 和 Python 3.x均可
print ('Hello')


为了同时打印输出多个字符串,我们可以导入 print_function,用来阻止 Python 2.x 把它们解释成一个元组(tuple)。

#只能在 Python 2.x中这么用:
print 'Hello','Guido'


在模块的顶部导入新的函数,可提升兼容性。

# Python 2.x和Python 3.x均可使用:
from_future_import print_function
print('Hello','Guido')

3) 异常处理上的差异

在 Python 3.x 中,对异常的处理也做了更新,这个和 print 处理手法类似,此处不再赘述。

4) 部分模块名和函数名的差异

相比于 Python 2.x,Python 3.x 中似乎“少”了很多的模块包,其实在大多数情况下,这些包只是改了个名字而已。部分函数名发生了变化,例如存在 xrange 和 range 的差异。此外,运算规则也发生了变化,例如在 Python 3.x中,5/2 的结果是 2.5,而不是 Python 2.x 中的整数 2,Python 3.x 会把所有整数之间的除法结果换算成一个浮点数(float)。

以上仅仅给出粗略对比,更多具体细节上的差异,请读者自行参考 Python 3.x 官方文档。

下面给出好用的脚本,通过加载如下脚本,Python 3.x 能完美兼容绝大部分通过 Python 2.7 以上版本编写的代码。

【例 1 】
#!/usr/bin/env python
from_future_import (division, print_function, absolute_import, unicode_literals)
from builtins import int
try:
    from future_builtins import ascli, filter, hex, map, oct, zip
except:
    pass
import sys
if sys.version_info.maj or > 2:
    xrange = range

相关文章