Python3 和 Python2 主要差异

来源:互联网 发布:好医生app软件 编辑:程序博客网 时间:2024/06/05 09:46

Python3打破了Python2向后兼容,极大提高了性能
Python3引入的重要差异可分为一下几个方面:

  1. 语法变化,删除/修改了一些语法元素,并添加了一些新的语法元素
  2. 标准库中的变化
  3. 数据类型与集合的变化

语法变化

有些语法变化会导致当前代码无法运行,这些变化是最容易发现,运行这些代码,解释器就会抛出SyntaxError异常。例如:

Python 3.6.1 (v3.6.1:69c0db5, Mar 21 2017, 18:41:36) [MSC v.1900 64 bit (AMD64)] on win32Type "help", "copyright", "credits" or "license" for more information.>>> print("hello world")hello world>>> print "hello world"  File "<stdin>", line 1    print "hello world"                      ^SyntaxError: Missing parentheses in call to 'print'

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

  • print不再是一条语句,所有必须加上括号
  • 捕获异常的语法由 except exc, var 改为 except exc as var

Python2

raise IOError, "file error"   #抛出异常except NameError, err:        #捕捉异常

Python3

raise IOError("file error")    #抛出异常except NameError as err:       #捕捉异常
  • 弃用比较运算符<>, 改用 !=
  • from module import * 现在只能用于模块, 不能用在函数中
  • 现在 from .[module] import name 是相对导入的唯一正确的语法。所有不以点字符开头的导入都被当作绝对导入
  • sorted函数与列表的sort方法不再接受cmp参数,应该用key参数来代替
  • 整数除法表达式(如 1/2)返回的是浮点数。取整运算可以用//运算符,如 1//2.这样做的好处是浮点数也可以用这个运算符,所以 5.0//2.0 == 2.0 。
>>> 1/20.5>>> 1//20>>> 5.0//2.02.0

标准库中的变化

语法变化很容易发现,标准库的重大变化也是非常容易发现的。Python的每个后续版本都会向标准库模块添加、弃用、改进或完全删除某些内容。大多数情况下,对于删除或重组的模块(例如 urlparse 移到 urllib.parse), 在运行解释器时会对导入语句抛出异常。

数据类型与集合的变化

不兼容的语法变化或标准库变化很容易发现,也很容易修复,但是集合与数据类型的变化要么难以察觉,要么需要大量的重复工作。
Python3中字符串处理的变化,这里是Python3中最具有争议的变化
现在所有的字符串都是 Unicode,字节(bytes)需要加一个b或B的前缀。
Python2中使用 ASCII 码作为默认编码方式导致string有两种类型str和unicode,Python3只支持unicode的string。python2和python3字节和字符对应关系为:
这里写图片描述
命名:字节与字节字符串的对比
由于Python3中的变化,有些人倾向将bytes实例称为字节字符串。这主要是由于历史原因,Python3中的bytes是与Python2中的str类型最为接近的序列类型(但并不完全相同)。不过bytes实例是字节序列,也不需要表示文本数据。所有为了避免混淆,虽然bytes实例与字符串具有相似性,但建议始终将其称为bytes或字节序列。Python3中字符串的概念是为了文本数据准备的,现在始终是str类型。