Python 软件基金会宣布,到 2020 年元旦,将不再为编程语言 Python 2.x 分支提供任何支持。这一天将标志着一出延续多年的戏剧的高潮:Python 从较旧的、功能较弱的、广泛使用的版本过渡到更新的、更强大的版本。然而,Python 的新版本在采用上仍然落后于它的旧版本。未来几年里,还会有很多人继续使用 Python 2 编写的程序,当世界被 Python 3 迅速占领之时,受困于寿命终将终结的 Python 2,你应该怎么办?
现在,是时候了。与 Python 2 相比,Python 3 有着无数的技术和最终用户增强功能,但却未能永久取代 Python 2。PyPI 存储库中托管的大多数流行包都支持 Python 3(该库是可重用 Python 代码的第一站)。Python 3 现在已经成为许多 Linux 发行版默认的 Python 解释器。大多数最近出版的书籍、编码学院和在线课程都向初学者推荐了 Python 3。
下面就让我们一起来总结了一些Python2与Python3的区别,希望对Python3学习的朋友们有所帮助:
1 __future__模块
Python 3.x 介绍的 一些Python 2 不兼容的关键字和特性可以通过在 Python 2 的内置__future__ 模块导入。如果你计划让你的代码支持 Python 3.x,建议你使用 __future__模块导入。例如,如果我想要 在Python 2 中表现 Python 3.x 中的整除,我们可以通过如下导入:
from __future__ import division
2 print函数
很琐碎,而print语法的变化可能是最广为人知的了,但是仍值得一提的是: Python 2 的 print 声明已经被 print()函数取代了,这意味着我们必须包装我们想打印在小括号中的对象。
Python 2 不具有额外的小括号问题。但对比一下,如果我们按照 Python 2 的方式不使用小括号调用print 函数,Python 3 将抛出一个语法异常(SyntaxError)。
3 整除
如果你正在移植代码,这个变化是特别危险的。或者你在 Python 2 上执行 Python 3 的代码。因为这个整除的变化表现在它会被忽视(即它不会抛出语法异常)。
因此,我还是倾向于使用一个float(3)/2 或3/2.0代替在我的 Python 3 脚本保存在 Python 2 中的 3/2的一些麻烦(并且反而过来也一样,我建议在你的 Python 2 脚本中使用 from __future__ import division)。
4 Unicode
Python 2 有 ASCII str() 类型,unicode()是单独的,不是 byte 类型。
现在, 在 Python 3,我们最终有了 Unicode (utf-8)字符串,以及一个字节类:byte和 bytearrays。
5 xrange模块
在 Python 2 中xrange()创建迭代对象的用法是非常流行的。比如: for循环或者是列表/集合/字典推导式。
这个表现十分像生成器(比如。“惰性求值”)。但是这个 xrange-iterable是无穷的,意味着你可以无限遍历。
由于它的惰性求值,如果你不得仅仅不遍历它一次,xrange() 函数 比range()更快(比如 for 循环)。尽管如此,对比迭代一次,不建议你重复迭代多次,因为生成器每次都从头开始。
在 Python 3 中,range()是像 xrange() 那样实现以至于一个专门的 xrange()函数都不再存在(在 Python 3 中xrange()会抛出命名异常)。
6 Python3中的range对象的__contains__方法
另外一件值得一提的事情就是在 Python 3 中range有一个新的__contains__方法(感谢 Yuchen Ying 指出了这个),__contains__方法可以加速 “查找” 在 Python 3.x 中显著的整数和布尔类型。
注意在 Python 2 和 Python 3 中速度的不同
有些人指出了 Python 3 的 range() 和 Python 2 的 xrange() 之间的速度不同。因为他们是用相同的方法实现的,因此期望相同的速度。尽管如此,这事实在于 Python 3 倾向于比 Python 2 运行的慢一点。
7 抛出异常
Python 2 接受新旧两种语法标记,在 Python 3 中如果我不用小括号把异常参数括起来就会阻塞(并且反过来引发一个语法异常)。
8 处理异常
在 Python 3 中处理异常也轻微的改变了,在 Python 3 中我们现在使用 as 作为关键词。
9 next()函数和.next()方法
因为 next() (.next())是一个如此普通的使用函数(方法),这里有另外一个语法改变(或者是实现上改变了),值得一提的是:在 Python 2.7.5 中函数和方法你都可以使用,next()函数在 Python 3 中一直保留着(调用.next()抛出属性异常)。
10 For循环变量和全局命名空间泄漏
好消息:在 Python 3.x 中for循环变量不会再导致命名空间泄漏。在 Python 3.x 中做了一个改变,在 What’s New In Python 3.0 中有如下描述:“列表推导不再支持[... for var in item1, item2, ...] 这样的语法。使用[... for var in (item1, item2, ...)]代替。也需要提醒的是列表推导有不同的语义: 他们关闭了在list()构造器中的生成器表达式的语法糖, 并且特别是循环控制变量不再泄漏进周围的作用范围域。
11 比较不可排序类型
在 Python 3 中的另外一个变化就是当对不可排序类型做比较的时候,会抛出一个类型错误。
12 通过input()解析用户的输入
幸运的是,在 Python 3 中已经解决了把用户的输入存储为一个 str对象的问题。为了避免在 Python 2 中的读取非字符串类型的危险行为,我们不得不使用raw_input()代替。