2.x到3.x的新特性

  目前, Python有两个版本, 一个是2.x版, 一个是3.x版, 这两个版本是不兼容的。3.x不考虑对2.x代码的向后兼容。虽然当前大部分公司都是基于2.7版本进行开发的, 但是3.x版会越来越普及。

  在3.x中, 一些语法、内建函数和对象的行为有所调整。 大部分Python库都同时支持Python2.x和3.x版本,所以无论选择哪个版本都可以。 为了在使用Python是避免某些版本中常见的陷阱, 或者需要移植某个Python项目时, 依然有必要了解一下Python两个版本之间的主要区别。

  两个版本之间的主要区别如下:

  1. 使用__future__模块

  Python3.x引入了一下与Python2.x不兼容的关键字和特性。 在Python2中, 可以通过内置的__future__模块导入这些新内容。 如果希望在Python2环境下写的代码也可以在Python3中运行, 那么建议使用__future__模块。

  2. print函数

  虽然print语法是Python3中的一个很小的改动, 而且应该已经广为人知, 但依然值得提一下: Python2中的print语句被Python3中的print()函数取代, 这意味着在Python3中必须用括号将需要输出的对象括起来。 在Python2中使用额外的括号也可以, 但是如果要在Python3中以Python2的形式不带括号调用print函数, 就会触发SyntaxError(语法错误)

  3. 整数除法

  由于人们常常会忽视Python3在整数除法上的改动(写错了也不会触发SyntaxError), 因此在移植代码或在Python2中执行Python3的代码时需要特别注意这个改动。

  4. Unicode

  Python2有基于ASCII的str()类型, 可通过单独的unicode()函数转成unicode类型, 但没有byte类型。在Python3中有了Unicode(UTF-8)字符串和两个自己类(bytes和bytearrays)。

  5. xrange

  在Python2.x中, 经常会用到xrange()创建一个可迭代对象, 通常出现在‘for循环’ 或 ‘列表/集合/字典推导式’ 中。 在Python3中, range()的实现方式与xrange()函数相同, 所以不存在专用的xrange() (在Python3中使用xrange()会触发NameError)。

  6. 触发异常

  Python 2支持新旧两种异常触发语法,而Python 3只支持带括号的语法(不然会触发SyntaxError)。

  7. 处理异常

  Python 3中的异常处理发生了一点变化。在Python 3中必须使用as关键字,Python 2中不需要。

  8. next()函数和.next()方法

  由于会经常用到next()(.next())函数(方法),因此要提到另一个语法改动(实现方面也做了改动):在Python 2中,函数形式和方法形式都可以使用;在Python 3中,只能使用next()函数(试图调用.next()方法会触发AttributeError)。

  9. for循环变量与全局命名空间泄漏

  在Python 3.x中,for循环中的变量不再会泄漏到全局命名空间中了。

  10. 比较无序类型

  Python 3中另一个优秀的改动是,如果我们试图比较无序类型,就会触发一个TypeError。

  11. 使用input()解析输入内容

  Python 3改进了input()函数,这样该函数就会总是将用户的输入存储为str对象。在Python 2中,为了避免读取非字符串类型会发生的一些危险行为,不得不使用raw_input()代替input()。

  12. 返回可迭代对象,而不是列表

  某些函数和方法在Python 3中返回的是可迭代对象,而不像在Python 2中返回列表。对象只遍历一次会节省很多内存,如果通过生成器多次迭代这些对象,效率就不高了。此时如果需要列表对象,可以通过Python 3的list()函数简单地将可迭代对象转成列表。

猜你喜欢

转载自www.cnblogs.com/yuyafeng/p/12446179.html