0
点赞
收藏
分享

微信扫一扫

Python 3 和 Python 2 的主要差异

扒皮狼 2024-04-07 阅读 3

前面已经说过,Python 3 打破了对 Python 2 的向后兼容。但它并不是完全重新设计的。

而且,也并不是说 2.x 版本的 Python 模块在 Python 3 下都无法运行。代码可以完全跨版本兼

容,无需其他工具或技术在两大版本上都可以运行,但一般只有简单应用才能做到这一点。

为什么要关注这些差异

本章前面说过我个人对 Python 2 兼容性的看法,但是目前不可能完全忽视这一点。还有

一些 Python 包(例如第 6 章将讲到的 fabric)十分实用,但可能短期内不会迁移到 Python 3。

另外,有时我们还会受到所在公司的制约。现有的遗留代码可能非常复杂,迁移代码

的费用难以承受。所以即使我们现在决定只用 Python 3,短期内也不可能完全放弃 Python 2。

如今想要自称专业开发者,没有对社区的回馈是说不过去的,所以帮助开源软件开发

者向现有软件包中添加对 Python 3 的兼容,可以很好地偿还在使用这些软件包时产生的“道

德债(moral debt)”。当然,不了解 Python 2 和 Python 3 的差异是无法做到这一点的。顺便 提一下,对于 Python 3 新手来说,这也是一项很好的练习。

主要的语法差异和常见陷阱

要比较不同版本之间的差异,最好的参考资料就是 Python 文档。不过为了方便读者,

本节总结了其中最重要的内容。但不熟悉 Python 3 的读者还是要去阅读官方文档。

Python 3 引入的重要差异一般可分为以下几个方面。

• 语法变化,删除/修改了一些语法元素,并添加了一些新的语法元素。

• 标准库中的变化。

• 数据类型与集合的变化。

语法变化

有些语法变化会导致当前代码无法运行,这些变化是最容易发现的,它们会导致代码

根本无法运行。包含新语法元素的 Python 3 代码在 Python 2 中无法运行,反之亦然。由于

删除了某些元素,导致 Python 2 代码显然无法与 Python 3 兼容。运行有这些问题的代码时,

解释器很快就会抛出 SyntaxError 异常。下面是一个无法运行的脚本示例,只包含两个语句,都会引发语法错误而无法运行:

print("hello world")

print "goodbye python2"

上述代码在 Python 3 中的实际运行结果如下:

$ python3 script.py

File "script.py", line 2

print "goodbye python2"

^

SyntaxError: Missing parentheses in call to 'print'

列出所有的语法差异会比较长,而且 Python 3.x 的新版本也会不时添加新的语法元素,

在较早版本的 Python 中就会引发错误(即使在相同的 3.x 版本上也会报错)。其中最重要的

语法差异将会在第 2 章和第 3 章中讲到,所以这里无需全部列出。

与 Python 2.7 相比,删除或改动的内容要相对少一些,下面给出最重要的变化内容。

• print 不再是一条语句而是一个函数,所以必须加上括号。

• 捕获异常的语法由 except exc, var 改为 except exc as var。

• 弃用比较运算符<>,改用!=。

from module import *https://docs.python.org/3.0/reference/simple_stmts.html#import

现在只能用于模块,不能用在函数中。

• 现在 from .[module] import name 是相对导入的唯一正确的语法。所有不以

点字符开头的导入都被当作绝对导入。

• sorted 函数与列表的 sort 方法不再接受 cmp 参数,应该用 key 参数来代替。

• 整数除法表达式(如 1/2)返回的是浮点数。取整运算可以用//运算符,如 1//2。

这样做的好处是浮点数也可以用这个运算符,所以 5.0//2.0 == 2.0。

举报

相关推荐

0 条评论